當內部函式被儲存到外部時,將會生成閉包。閉包會導致**作用域鏈不釋放,造成記憶體占用。
// 練習題
function test()
} return arr;//返回到外部
}// 用myarr接收返回的陣列
var myarr = test();//執行test函式 返回arr裝了10個function
// 呼叫十個function
for (var j = 0; j < 10; j++)
// 解析:
test 定義 test.[[scope]]--->0:go
test 執行 test.[[scope]]--->0:testao
1:go
arr[i] 定義 arr[i].[[scope]]--->0:testao
test 執行 test.[[scope]]--->0:testao -test的for迴圈執行完後->
1:go
返回arr 在外部執行 此時的i已經為10
arr[i] 執行 arr[i].[[scope]]--->0:arr[i]ao
1:testao
用立即執行函式解決這個閉包列印相同i的問題
function test()
}(i));
} return arr;//返回到外部
}// 用myarr接收返回的陣列
var myarr = test();//執行test函式 返回arr裝了10個function
// 呼叫十個function
for (var j = 0; j < 10; j++)
// 解析:
test 定義 test.[[scope]]--->0:go
test 執行 test.[[scope]]--->0:testao
1:go
執行時 test.[[scope]]--->0:testao
1:go
執行立即執行函式--->立即執行函式的[[scope]]--->0:立即執行的ao
1:testao
arr[0] 定義 arr[0].[[scope]]--->0:立即執行的ao
1:testao
依次迴圈
arr[1] 定義 arr[1].[[scope]]--->0:立即執行的ao
1:testao
test 執行 test.[[scope]]--->0:testao -test的for迴圈執行完後->
1:go
返回arr 在外部執行 此時的i已經為10 但是每個arr[j]裡面的j是分別儲存的123456789
arr[j] 執行 arr[j].[[scope]]--->0:arr[j]ao
1:立即執行的ao 0-9
2:testao
// 通過閉包,建自己的私有屬性。
function person(name)
this.pay = function()
// ---------------------------
// 當new例項化後。建構函式內部會隱性
// var this =
// 在最後會隱性return this;
// 那麼money會在person的ao中儲存,並且被傳到外部。
// 於是在外部依然能訪問到money。只是無法修改
}// 當例項化物件時 讓他可以通過方法,使money增減。
// 卻無法看到我的money,也無法直接修改money
var person = new person();
繼承(3) 閉包封裝,屬性私有化
高大上的寫法 var inherit function return function target,origin 相當於 var inherit function function demo target,origin return demo return乙個函式相當於return乙個函式的引用。...
閉包與私有變數
看了高程之後知道閉包可以用於建立私有變數,但是對於私有變數仍然不是很懂,後來看了單頁web應用這本書之後,對於私有變數有了更深入的理解,這裡小小總結一下。閉包這裡就不多囉嗦了,相信大家都有一定的了解了,可以理解成a函式裡面套了乙個b函式,而b函式可以訪問到a函式裡面的變數 其實除了私有變數之外相應的...
閉包 解決閉包問題
1 函式和對其周圍狀態 lexical environment,詞法環境 的引用 在一起構成閉包 closure 2 函式與函式所依賴的上下文環境組成閉包問題。3 閉包指的是 能夠訪問另乙個函式作用域的變數的函式。清晰的講 閉包就是乙個函式,這個函式能夠訪問其他函式的作用域中的變數。var arr ...