優先定義,使用滯後

zhaiduting發表於2020-11-23

優先定義,使用滯後

var f = function(){
    console.log('立即執行 f()');
    f.p = 'fp';
    function f(){
        console.log('執行 f()');
    }
    return f;
}();    //立即執行 f()
f();    //執行 f()
f.p;    // fp

(圖1)變數 f 是一個立即執行函式,內部又巢狀了一個同名函式 f()。雖然 f.p 的賦值語句位於內嵌函式 f() 定義之前,但是在執行的時候賦值語句滯後於函式的定義。

var g = function(){
    console.log('立即執行 g()');
    function f(){
        console.log('執行 f()');
    }
    f.p = 'fp';
    return f;
}();    //立即執行 g()
g();    //執行 f()
g.p;    // fp

(圖2)將變數 f 改成了 g,並將 f.p 的賦值語句寫到內嵌函式的下方,這比圖1的寫法更容易理解。

優先定義,使用滯後
圖3正常,圖4報錯。儘管圖4的變數 f 是一個立即執行函式,但是立即執行函式與函式並不是一回事。
修正方法1:程式碼改成圖3那樣,f 不再立即執行,f 是全域性函式。
修正方法2:程式碼改成圖1或圖2那樣(立即函式裡面新增內嵌函式)。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章