javascript對閉包的深入理解

2021-07-04 17:04:46 字數 1662 閱讀 9799

最近看了一些關於閉包的內容,自己總結了一下:

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...