1. 程式人生 > >閉包、for迴圈和立即執行函式

閉包、for迴圈和立即執行函式

閉包與變數

  作用域鏈的一個副作用:閉包只能取得包含函式中任何變數的最後一個值。

複製程式碼程式碼如下:
function createFunctions(){
    var result = new Array();
    for (var i=0; i < 10; i++){
        result[i] = function(){
            return i;
        };
    }
    return result;
}

  ①createFunctions()函式,將10個閉包賦值給陣列result,再返回result陣列。每個閉包都返回自己的索引,但實際上都返回10。
   因為每個函式(閉包)的作用域鏈中都儲存著createFunctions()函式的活動物件,所以它們引用的是同一個變數i,當createFunctions函式執行完後i的值10,故閉包中的i也都為10。

  ②解決辦法,不使用閉包,建立一個匿名函式,將i值賦值給其引數:
複製程式碼程式碼如下:
function createFunctions(){
    var result = new Array();
    for (var i=0; i < 10; i++){
        result[i] = function(num){
            return function(){
                return num;
            };
        }(i);
    }
    return result;
}

  建立一個每次迴圈都會執行一次的匿名函式:將每次迴圈時包圍函式的i值作為引數,存入匿名函式中。因為函式引數是按值傳遞的,而非引用,所以每個匿名函式中的num值 都為每此迴圈時i值的一個副本。

--------------------------------------------------------------------

因為每個函式(閉包)的作用域鏈中都儲存著createFunction()函式的活動物件,所以它們引用的是同一個變數i,這句話是重點。