閉包與變數

2021-09-23 14:34:00 字數 1264 閱讀 7544

js高程中關於閉包與變數這一節,講到乙個案例,我當時看的一臉懵逼,然後就自習的研究了一下,先上**:

function createfunctions(); 

} return result;

} //呼叫最外層函式,接收返回的陣列

var arr = createfunctions();

// 迴圈遍歷陣列,呼叫每個元素並列印

for (var i = 0; i < arr.length; i++ )

為啥是10個10呢,乍一看,迴圈的時候,返回的i應該是對應的索引啊,那麼列印出來的應該是0-9才對,也就是這樣:

result[0] = function() ;

result[1] = function() ;

result[2] = function() ;

其實這個問題的關鍵在於,函式是啥時候被呼叫的

在呼叫createfunctions這個函式之後,返回的result陣列實際上是這樣的:

result[0] = function() ;

result[1] = function() ;

result[2] = function() ;

而當我們去呼叫陣列中的元素時,陣列元素對應的匿名函式才會被呼叫,此時返回i,很顯然,當前作用域中並沒有i,那麼就需要到他的上一層作用域去找,而這個時候,迴圈結束, i已經是10了,所以我們無論呼叫陣列中的哪個元素,返回的都是10;

問題的關鍵就在於,我們沒有立即使用i這個變數,而是把它儲存在起來,需要的時候再呼叫,而i這個變數一直在變化,所以我們需要在迴圈的每一步中,實時地獲取i的值,解決方案如下:

function createfunctions(); 

}(i);

} return result;

}

函式createfunctions被呼叫之後,在for迴圈中,自呼叫函式立即執行,獲取實時地i賦值給num. 迴圈結束之後,返回result:

result[0] = function() ;

result[1] = function() ;

result[2] = function() ;

此時我們再呼叫陣列元素時,閉包函式會去他的上層作用域中尋找num的值,(雖然用i給num賦值的自呼叫函式在被呼叫之後,它的執行環境的作用域鏈就被銷毀了,但是它的活動物件還在閉包函式的作用域鏈中,)所以會返回對應的元素下標.

閉包與變數

作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中的任何變數的最後乙個值。別忘了閉包所儲存的時整個變數物件,而不是某個特殊的變數。下面這個例子可以清晰地說明這個問題 function createfunction return result 這個函式返回的函式陣列中,所有函式的內部...

閉包與變數

作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中任何變數的最後乙個值。閉包所儲存的是整個變數物件,而不是某個特殊的變數。function createfunctions return result 上述函式會返回乙個函式陣列。表面上看,似乎每個函式都應該返回自己的索引值,即位置0...

閉包與變數

作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中任何變數的最後乙個值,別忘了閉包所儲存的是整個變數物件,而不是某個特殊的變數。下面的例子可以清晰的說明這個問題 function createfunctions return result 這個函式會返回乙個函式陣列,表面上看,似乎...