最近看了一些關於閉包的內容,自己總結了一下:
function getfunction()
}return result;
}var result1 = getfunction();
for(var j=0;j<10;j++)
每乙個內部函式都會儲存著屬於自己的作用域鏈,而它自己的作用域鏈包括了自己的活動物件,外部函式的活動物件,全域性的
活動物件,當查詢變數時會逐級查詢,分析上面內部函式的作用域鏈:
內部函式的活動物件有:arguments=null this = window(如果不指定this,內部函式this將為window)
外部函式的活動物件有:arguments=null this=getfunction result(new array()) i=10
全域性函式的活動物件有:result1=undefined this = window getfunction-->getfunction的作用域鏈
通過上面對活動物件的分析:
當呼叫內部函式時,獲取的i永遠為10;
那麼我們將如何解決,方法如下:
function getfunction();
}(i);
}return result;
}var result1 = getfunction();
for(var i=0;i<10;i++)
內部函式的活動物件有:arguments=null this = window(如果不指定this,內部函式this將為window)
外部函式1的活動物件有:arguments[num] this=window(如果不指定this,內部函式this將為window) num(儲存著1-9)
外部函式2的活動物件有:arguments=null this=getfunction result(new array()) i=10
全域性函式的活動物件有:result1=undefined this = window getfunction-->getfunction的作用域鏈
所以當呼叫時,找到num,所以會輸出正常.
理解下面的例子:
var name = "the window";
var person = }};
alert(person.getname()());
輸出的結果是 "the window" ,下面是對結果的分析:
內部函式查詢arguments和this兩個變數時,只會查詢到其當前活動物件為止
分析活動物件:
內部函式的活動物件有:this=window arguments=null
所以此時this=window,相當於呼叫window.name,所以輸出為"the window"
那怎樣才能讓其輸出為"person name":
var name = "the window";
var person = }};
alert(person.getname()());
輸出結果是 "person name",下面是對結果的分析:
分析活動物件:
內部函式的活動物件有:this=window arguments=null
外部函式的活動物件有:this=person arguments=null that=this
所以當呼叫that.name時會返回"person name";
javascript 原型 this 閉包 深拷貝
function a console.log a window 複製 for var i 1 i 5 i i 1000 輸出5個6,首先因為 settime 是個非同步函式,所有會先把迴圈全部執行完畢,這時i等於6,for let i 1 i 5 i i 1000 i 1000 i i 複製 fun...
javascript閉包詳解
下面先看乙個例子,在不執行的情況下推測一下返回結果.function t1 return t2 var temp t1 var age 99 temp 在學習了作用域之後也許會分析結果是99,實際上是20.下面對其一一分析 在大部分語言中,t1被呼叫執行,則申請記憶體並把其區域性變數push入棧。t...
javascript閉包使用
之前看到一段 很是不能理解,然後就查詢資料並且找網路上得大牛請教,最後弄懂了這段 然後就拿出來總結一下。先來看一段 var arrtest for var i 0 i 3 i arrtest function function function console.log arrtest 0 tostr...