javascript中函式的分類
前段寫js程式碼的時候經常會碰到“長得特別的” function ,現在在此做下總結:
函式分類:
- 普通函式
- 匿名函式
- 閉包函式
普通函式
1.1 簡單示例
function test(){
console.log("簡單示例");
}
test(); //控制檯輸出:簡單示例
1.2 Js中同名函式的覆蓋
在Js中函式是沒有過載
,定義相同函式名、不同引數簽名的函式,後面的函式會覆蓋前面的函式
,呼叫時,只會呼叫後面的函式
示例:
function test(name){
console.log(name + "這是第一個函式" );
}
test("jerry"); //控制檯輸出:jerry這是第二個函式
function test(name.sex){
console.log(name + "這是第二個函式");
}
test("jerry"); //控制檯輸出:jerry這是第二個函式
1.3 arguments
物件,相當於可以傳遞不定長引數
示例:
function test(){
for(i = 0;i < arguments.length;i++){
console.log(arguments[i]);
}
}
test("Tom","jerry","asl" );//控制檯輸出:Tom jerry asl
test("Tom","jerry");//控制檯輸出:Tom jerry
1.4 有返回值的函式 return
示例:
function test(num){
return num+1;
}
test(2);
測試結果如下:
說明:return返回結果也便是函式結束(可以理解為java中return的用法)
如果函式沒有返回值,則預設認為是返回undefined
匿名函式
可以把函式賦值給變數、事件
示例:
//變數匿名函式,左側可以為變數、事件等
var anonymousNormal = function (p1, p2) {
console.log(p1+p2);
}
anonymousNormal(3,6);//控制檯輸出9
適用場景
避免函式名汙染。具體檢視另一篇博文“JS閉包的運用及匿名函式的作用”
無名稱匿名函式示例:
(function (p1) {
console.log(p1);
})(1);
適用場景:
只需執行一次的。如瀏覽器載入完,只需要執行一次且後面不執行的功能。
關於(function(){})()
;這種寫法,意思是把函式作為表示式,加上後面的(),表示立即執行,要知道小括號的作用就是把括號裡面的程式碼塊分組並返回值,而包裹匿名函式,返回的就是一個Function物件,再加上一個(),就跟平常呼叫函式的形式一樣。正如我們在看JQ外掛的時候,其最基本的程式碼格式就是(function(){})();
閉包函式
說明:假設,函式A內部聲明瞭個函式B,函式B引用了函式B之外的變數,並且函式A的返回值為函式B的引用。那麼函式B就是閉包函式。
示例1:全域性引用與區域性引用
function funA() {
var i = 0;
function funB() { //閉包函式funB
i++;
console.log(i)
}
return funB;
}
var allShowA = funA(); //全域性變數引用:累加輸出1,2,3,4等
allShowA (); //輸出1
allShowA (); //輸出2
allShowA (); //輸出3
function partShowA() {
var showa = funA();//區域性變數引用:只輸出1
showa();
}
allShowA
是個全域性變數
,引用了函式funA。重複執行allShowA(),會輸出1,2,3,4等累加的值。
執行函式partShowA(),因為內部只聲明瞭區域性變數
showa來引用funA,執行完畢後因作用域的關係,釋放showa佔用的資源。
閉包的關鍵就在於作用域:全域性變數佔有的資源只有當頁面變換或瀏覽器關閉後才會釋放。var allShowA = funA() 時,相當於allShowA引用了funB(),從而使funB()裡的資源不被GC回收,因此funA()裡的資源也不會。
示例2:有參閉包函式
function funA(arg1,arg2) {
var i = 0;
function funB(step) {
i = i + step;
console.log(i)
}
return funB;
}
var allShowA = funA(2, 3); //呼叫的是funA arg1=2,arg2=3
allShowA(1);//呼叫的是funB step=1,輸出 1
allShowA(3);//呼叫的是funB setp=3,輸出 4
示例3:父函式funA內的變數共享
function funA() {
var i = 0;
function funB() {
i++;
alert(i)
}
allShowC = function () {
// allShowC引用匿名函式,與funB共享變數i
i++;
console.log(i)
}
return funB;
}
var allShowA = funA();
var allShowB = funA();
//allShowB引用了funA,allShowC在內部重新進行了繫結,與allShowB共享變數i
適用場景
保證函式funA內裡的變數安全,因為外部不能直接訪問funA的變數。