一 函數(shù)的定義
JavaScript三種定義函數(shù)方法:
*第一種 使用function語句定義函數(shù)
myFunction(5);
function myFunction(y) {
return y * y;
}
第二種 使用Function()構(gòu)造函數(shù)來定義函數(shù)(不常用)
var 函數(shù)名 = new Function(“參數(shù)1”,”參數(shù)2”帆啃,”參數(shù)3”……”函數(shù)體”);
如:
var 函數(shù)名 = new Function("x","y","var z=x+y;return z;");
*第三種 函數(shù)表達(dá)式
JavaScript 函數(shù)可以通過一個表達(dá)式定義瞬女。
函數(shù)表達(dá)式可以存儲在變量中:
var 函數(shù)名 = function(參數(shù)1,參數(shù)2努潘,…){函數(shù)體};
//例如:
//定義
var add = function(a,b){
return a+b;
}
//調(diào)用函數(shù)
document.write(add(50,20));
第四種 自調(diào)用函數(shù)
函數(shù)表達(dá)式可以 "自調(diào)用"诽偷。
自調(diào)用表達(dá)式會自動調(diào)用。
如果表達(dá)式后面緊跟 () 疯坤,則會自動調(diào)用报慕。
不能自調(diào)用聲明的函數(shù)。
通過添加括號压怠,來說明它是一個函數(shù)表達(dá)式:
實例:
(function () {
var x = "Hello!!"; // 我將調(diào)用自己
})();
注意:
arguments 對象
在函數(shù)代碼中眠冈,使用特殊對象 arguments,開發(fā)者無需明確指出參數(shù)名菌瘫,就能訪問它們蜗顽。
例如,在函數(shù) sayHi() 中雨让,第一個參數(shù)是 message雇盖。用 arguments[0]
也可以訪問這個值,即第一個參數(shù)的值(第一個參數(shù)位于位置 0栖忠,
第二個參數(shù)位于位置 1刊懈,依此類推)这弧。
例如: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ù)問題:
1. 函數(shù)外面定義的變量是全局變量,函數(shù)內(nèi)可以直接使用
2. 在函數(shù)內(nèi)部沒有使用var定義的=變量則為全局變量
3. 在函數(shù)內(nèi)使用var關(guān)鍵字定義的變量是局部變量虚汛,即出了函數(shù)外邊無法獲取匾浪。
函數(shù)支持默認(rèn)值
4. 在函數(shù)內(nèi)部定義的函數(shù)為局部函數(shù) 在函數(shù)外部不能獲取到
二 JavaScript 閉包
JavaScript 變量可以是局部變量或全局變量。
私有變量可以用到閉包卷哩。
函數(shù)內(nèi)部可以修改函數(shù)外部的全局變量
計數(shù)器困境
設(shè)想下如果你想統(tǒng)計一些數(shù)值蛋辈,且該計數(shù)器在所有函數(shù)中都是可用的。
你可以使用全局變量将谊,函數(shù)設(shè)置計數(shù)器遞增:
var counter = 0;
function add() {
return counter += 1;
}
add();
add();
add();
// 計數(shù)器現(xiàn)在為 3
但問題來了冷溶,頁面上的任何腳本都能改變計數(shù)器,即便沒有調(diào)用 add() 函數(shù)尊浓。
如果我在函數(shù)內(nèi)聲明計數(shù)器逞频,如果沒有調(diào)用函數(shù)將無法修改計數(shù)器的值:
function add() {
var counter = 0;
return counter += 1;
}
add();
add();
add();
// 本意是想輸出 3, 但事與愿違,輸出的都是 1 !
JavaScript 內(nèi)嵌函數(shù)
所有函數(shù)都能訪問全局變量栋齿。
實際上苗胀,在 JavaScript 中,所有函數(shù)都能訪問它們上一層的作用域瓦堵。
JavaScript 支持嵌套函數(shù)基协。嵌套函數(shù)可以訪問上一層的函數(shù)變量。
該實例中菇用,內(nèi)嵌函數(shù) plus() 可以訪問父函數(shù)的 counter 變量:
實例:
function add() {
var counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
JavaScript 閉包
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
// 計數(shù)器為 3
實例解析
變量 add 指定了函數(shù)自我調(diào)用的返回字值澜驮。
自我調(diào)用函數(shù)只執(zhí)行一次。設(shè)置計數(shù)器為 0惋鸥。并返回函數(shù)表達(dá)式杂穷。
add變量可以作為一個函數(shù)使用。非常棒的部分是它可以訪問函數(shù)上一層作用域的計數(shù)器卦绣。
這個叫作 JavaScript 閉包亭畜。它使得函數(shù)擁有私有變量變成可能。
計數(shù)器受匿名函數(shù)的作用域保護迎卤,只能通過 add 方法修改拴鸵。
232323.png