這篇文章給大家分享的是淺談對閉包的理解 ,內容還蠻不錯的,希望可以幫助到有需要的朋友
##作用域鏈var name = "tianci";當我們執行完上面的程式碼的時候,在瀏覽器中window.name屬性便是“tianci”,此時window[[scope]]指向的作用域列表所指向的變數空間就有name:"tianci"存在
var name = "tianci"; function sy() { var name = "haha"; console.log(name); } sy();//haha在這個程式碼中,執行到sy()的時候,sy的執行環境的[[scope]]指向的作用域列表會先將window的作用域列表複製到自己的列表,在將sy變數空間插入到作用域列表的頭部(即 list.[0]的位置)。執行到name的時候便會從列表開始查詢name變量,0->1 -> 2 ->3 ......一直到最頂層的變量環境為止。
var name = "tianci"; function sy() { var name = "haha"; console.log(name); console.log(this.name); } sy(); //haha //tianci兩次輸出不一樣log(name)的時候函數sy先從自身的環境找name所以輸出hahalog(this.name)的時候sy的this指向了window(在瀏覽器中),所以查詢的起始會從window的環境開始查找name所以輸出tianci#1.作用域鏈就是一個指向多個物件儲存空間的列表,2.每次函數被呼叫的時候,就會先將呼叫者的作用域鏈copy到自己的作用域鏈,再在鍊錶頭部插入自己的作用域閉包閉包就不是很難理解了,閉包概念就是有權訪問另一個函數作用域的變數的函數,其常見的創建方式就是在漢輸得內部創建另一個函數如:
function cC(property) { return function (obj1,obj2) { var value1 = obj1[property] var value2 = obj2[property] if (value1 < value2) { return -1; }else if(value1 > value2){ return 1; }else if(value1 == value2){ return 0; } } }在這裡匿名函數中便訪問了呼叫函數的變數property,這便是閉包但是閉包會有一個問題,就是當cC執行完之後匿名函數若沒有執行結束,cC的環境活動物件也不會被銷毀,只有等匿名函數執行完後,才會被銷毀。所以閉包有時會造成不必要的記憶體洩漏通常情況下匿名函數的this物件會指向window(瀏覽器中)因為當得到傳回的匿名函數之後通常都是在全域環境中直接呼叫了,所以會造成this當時指向的是window。
var name = "chentainci"; var obj ={ name:"myboj", getName:function () { return function () { return this.name } } } console.log(obj.getName()())閉包只是取得變數的終值
function fun() { var result =new Array(); for (var i = 0;i < 10; i++) { result[i] = function () { return i } } return result; }result儲存的是函數的回傳值都是i的終值10
相關推薦:
以上是實例淺析對閉包的理解的詳細內容。更多資訊請關注PHP中文網其他相關文章!