1. 程式人生 > >javascript中函式的分類

javascript中函式的分類

前段寫js程式碼的時候經常會碰到“長得特別的” function ,現在在此做下總結:

函式分類:

  1. 普通函式
  2. 匿名函式
  3. 閉包函式

普通函式

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的變數。