一、函數(shù)的定義
JavaScript三種定義函數(shù)方法:
1滤奈、第一種 使用function語(yǔ)句定義函數(shù)
myFunction(5);
function myFunction(y) {
return y * y;
}
2摆昧、第二種 使用Function()構(gòu)造函數(shù)來(lái)定義函數(shù)(不常用)
var 函數(shù)名 = new Function(“參數(shù)1”,”參數(shù)2”蜒程,”參數(shù)3”……”函數(shù)體”);
如:
var 函數(shù)名 = new Function("x","y","var z=x+y;return z;");
3绅你、第三種 函數(shù)表達(dá)式
JavaScript 函數(shù)可以通過(guò)一個(gè)表達(dá)式定義。
函數(shù)表達(dá)式可以存儲(chǔ)在變量中:
var 函數(shù)名 = function(參數(shù)1昭躺,參數(shù)2忌锯,…){函數(shù)體};
//例如:
//定義
var add = function(a,b){
return a+b;
}
//調(diào)用函數(shù)
document.write(add(50,20));
4、第四種 自調(diào)用函數(shù)
-
概述
函數(shù)表達(dá)式可以 "自調(diào)用"领炫。
自調(diào)用表達(dá)式會(huì)自動(dòng)調(diào)用偶垮。
如果表達(dá)式后面緊跟 () ,則會(huì)自動(dòng)調(diào)用帝洪。
不能自調(diào)用聲明的函數(shù)针史。
通過(guò)添加括號(hào),來(lái)說(shuō)明它是一個(gè)函數(shù)表達(dá)式:
-
實(shí)例:
(function () { var x = "Hello!!"; // 我將調(diào)用自己 })();
-
注意:
arguments 對(duì)象
在函數(shù)代碼中碟狞,使用特殊對(duì)象 arguments啄枕,開(kāi)發(fā)者無(wú)需明確指出參數(shù)名,就能訪問(wèn)它們族沃。
例如频祝,在函數(shù) sayHi() 中,第一個(gè)參數(shù)是 message脆淹。用 arguments[0]
也可以訪問(wèn)這個(gè)值常空,即第一個(gè)參數(shù)的值(第一個(gè)參數(shù)位于位置 0,
第二個(gè)參數(shù)位于位置 1盖溺,依此類(lèi)推)漓糙。-
例如:arguments
x = sumAll(1, 123, 500, 115, 44, 88); function sumAll() { var i, sum = 0; for (i = 0; i < arguments.length; i++) { sum += arguments[I]; } return sum; }
-
-
關(guān)于變量和參數(shù)問(wèn)題:
- 函數(shù)外面定義的變量是全局變量,函數(shù)內(nèi)可以直接使用
- 在函數(shù)內(nèi)部沒(méi)有使用var定義的=變量則為全局變量
- 在函數(shù)內(nèi)使用var關(guān)鍵字定義的變量是局部變量烘嘱,即出了函數(shù)外邊無(wú)法獲取昆禽。
函數(shù)支持默認(rèn)值 - 在函數(shù)內(nèi)部定義的函數(shù)為局部函數(shù) 在函數(shù)外部不能獲取到
二马僻、JavaScript 閉包
1蹈矮、概述
- JavaScript 變量可以是局部變量或全局變量梨与。
- 私有變量可以用到閉包
- 函數(shù)內(nèi)部可以修改函數(shù)外部的全局變量
2秉继、計(jì)數(shù)器困境
設(shè)想下如果你想統(tǒng)計(jì)一些數(shù)值,且該計(jì)數(shù)器在所有函數(shù)中都是可用的盗棵。
你可以使用全局變量壮韭,函數(shù)設(shè)置計(jì)數(shù)器遞增:
var counter = 0;
function add() {
return counter += 1;
}
add();
add();
add();
// 計(jì)數(shù)器現(xiàn)在為 3
但問(wèn)題來(lái)了,頁(yè)面上的任何腳本都能改變計(jì)數(shù)器纹因,即便沒(méi)有調(diào)用 add() 函數(shù)喷屋。
如果我在函數(shù)內(nèi)聲明計(jì)數(shù)器,如果沒(méi)有調(diào)用函數(shù)將無(wú)法修改計(jì)數(shù)器的值:
function add() {
var counter = 0;
return counter += 1;
}
add();
add();
add();
// 本意是想輸出 3, 但事與愿違瞭恰,輸出的都是 1 !
3逼蒙、JavaScript 內(nèi)嵌函數(shù)
所有函數(shù)都能訪問(wèn)全局變量。
實(shí)際上寄疏,在 JavaScript 中,所有函數(shù)都能訪問(wèn)它們上一層的作用域僵井。
JavaScript 支持嵌套函數(shù)陕截。嵌套函數(shù)可以訪問(wèn)上一層的函數(shù)變量。
該實(shí)例中批什,內(nèi)嵌函數(shù) plus() 可以訪問(wèn)父函數(shù)的 counter 變量:
實(shí)例:
function add() {
var counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
4农曲、JavaScript 閉包
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
// 計(jì)數(shù)器為 3
-
實(shí)例解析
變量 add 指定了函數(shù)自我調(diào)用的返回字值。
自我調(diào)用函數(shù)只執(zhí)行一次驻债。設(shè)置計(jì)數(shù)器為 0乳规。并返回函數(shù)表達(dá)式。
add變量可以作為一個(gè)函數(shù)使用合呐。非常棒的部分是它可以訪問(wèn)函數(shù)上一層作用域的計(jì)數(shù)器暮的。
這個(gè)叫作 JavaScript 閉包。它使得函數(shù)擁有私有變量變成可能淌实。
計(jì)數(shù)器受匿名函數(shù)的作用域保護(hù)冻辩,只能通過(guò) add 方法修改。
[圖片上傳失敗...(image-2de9e1-1632226684012)] | 閉包是可訪問(wèn)上一層函數(shù)作用域里變量的函數(shù)拆祈,即便上一層函數(shù)已經(jīng)關(guān)閉恨闪。 |
---|---|
閉包就是一個(gè)函數(shù)引用另一個(gè)函數(shù)的變量,因?yàn)樽兞勘灰弥圆粫?huì)被回收放坏,因此可以用來(lái)封裝一個(gè)私有變量咙咽。這是優(yōu)點(diǎn)也是缺點(diǎn),不必要的閉包只會(huì)增加內(nèi)存消耗淤年。 或者說(shuō)閉包就是子函數(shù)可以使用父函數(shù)的局部變量钧敞,還有父函數(shù)的參數(shù)蜡豹。 |