閉包就是能夠讀取其他函數內部變量的函數。由於在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。當一個函數初始化的時候會把他的執行上下文記錄在內部變量[[scope]]裡,當函數被調用時,一個新的執行上下文對象產生,先復制他的scope,然後把目前的上下文塞進去。
使用閉包很多時候是為了保留特定的執行上下文。
var myobject = (function() {
var value = 0;
return {
setValue: function(x) {
value += x;
},
getValue: function() {
return value;
}
}
})();
注意最後一行的 () ,
並不是將一個函數賦給myobject ,而是將調用該函數後的返回的對象賦值給它。
在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
拓展scope chain
with,和catch可以拓展作用域鏈scope chain,也就是在這兩個表達式的代碼裡會產生various object,但是比較特別:
function buildUrl() {
var qs = “?debug=true”;
with(location){
var url = href + qs;
}
return url; //這裡在with塊外面,但是仍然保留了URL變量,所以說是擴張
}