閉包與變數

2021-09-28 18:08:49 字數 1177 閱讀 9743

作用域鏈的這種配置機制引出了乙個值得注意的***,即閉包只能取得包含函式中任何變數的最後乙個值。閉包所儲存的是整個變數物件,而不是某個特殊的變數。

function createfunctions() ;

}return result;

}

上述函式會返回乙個函式陣列。表面上看,似乎每個函式都應該返回自己的索引值,即位置0返回0,但實際上每個函式都會返回10。因為每個函式的作用域鏈中都儲存著createfunctions()函式的活動物件,所以他們引用的都是同乙個變數i。但是我們可以建立另乙個匿名函式強制讓閉包的行為符合預期。

function createfunctions() ;

}(i);

}return result;

}

在上述例子中,我們並沒有直接將閉包賦值給陣列,而是定義了乙個匿名函式,並將立即執行該匿名函式的結果賦值給陣列。在這裡匿名函式有乙個引數num,也就是最終函式要返回的值。在呼叫每個匿名函式時,我們傳入了變數i。由於函式引數是按值傳遞的,所以就會將變數i的當前值賦值給引數num。而在這個匿名函式內部,又建立並返回了乙個訪問num的閉包。因此,result陣列中的每個函式都有自己num變數的乙個副本,因此可返回不同的值。

this物件

眾所周知,this物件是在執行時基於函式的執行函式繫結的:在全域性函式中,this等於window,而當函式被作為某個物件呼叫時,this等於那個物件。不過,因為匿名函式的執行環境具有全域性性,因此this物件通常指向window。

var name = "the window";

var object = ;}};

alert(object.getnamefunc()()); //"the window"

var name = "the window";

var object = ;}};

alert(object.getnamefunc()()); //"my object"

在定義匿名函式之前,我們把this物件賦值給了乙個名叫that的變數。而定義了閉包之後,閉包也可以訪問這個變數,因為它是我們在包含函式中特意宣告的乙個變數。即使在函式返回之後,that也仍然引用著object。

js閉包

閉包與變數

js高程中關於閉包與變數這一節,講到乙個案例,我當時看的一臉懵逼,然後就自習的研究了一下,先上 function createfunctions return result 呼叫最外層函式,接收返回的陣列 var arr createfunctions 迴圈遍歷陣列,呼叫每個元素並列印 for va...

閉包與變數

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

閉包與變數

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