整理的閉包問題

2021-08-07 14:26:11 字數 1598 閱讀 7220

給大家整理了下閉包的相關問題,能幫助加深對閉包的理解。

function f1()

function f2()

return f2;

}  var result=f1();

result(); // 999

nadd();

result(); // 1000

第一步,result是f2函式

第二步,執行result就是執行f2函式,又因為閉包使得f2能訪問除本身函式之外的變數,能訪問到變數n,所以結果是999

第三步,因為nadd沒有加var所以是全域性變數。nadd中能向下訪問區域性變數n=999,所以執行後n=1000

第四步,執行result,又執行f2,輸出n,所以n是1000

function f1()

function f2()

return f2;

}  var result1=f1();

var result2=f1();

result1(); // 999

result2();//999

nadd();

result1(); // 是999而不是1000,這是為何呢?

result2();//1000

這是因為產生了兩份閉包作用域。nadd得到的是最新的作用域中的n。

function fun(n,o) 

};}var a = fun(0); a.fun(1); a.fun(2); a.fun(3); //undefined,0,0,0

var b = fun(0).fun(1).fun(2).fun(3); //undefined,0,1,2

var c = fun(0).fun(1); c.fun(2); c.fun(3); //undefined,0,1,1

這個問題是經典的閉包問題

第一步,fun(0)返回的是fun(m,0);因為沒有第二個引數,所以輸出undefined

第二步,a.fun(1)相當於fun(m,0).fun(1),因為閉包的作用n會保留在作用域中,也就是0還在記憶體中,所以最後返回的是fun(1,0)因此輸出的是0

第三步,a.fun(2)和第二步同理

第四步,a.fun(3)和第二部同理

接著 第一步,fun(0)返回的是fun(m,0);因為沒有第二個引數,所以輸出undefined

第二步,fun(0).fun(1)相當於是fun(m,0).fun(1),因為閉包的作用n會保留在作用域中,也就是0還在記憶體中,所以最後返回的是fun(1,0)因此輸出的是0

第三步,fun(0).fun(1).fun(2)相當於fun(1,0).fun(2),因為閉包的作用n會保留在作用域中,也就是1還在記憶體中,所以最後返回的是fun(2,1)因此輸出的是1

第四步,fun(0).fun(1).fun(2).fun(3)相當於fun(2,1).fun(3)同第三步,因此輸出的是2

接著 想必看到這你就知道了為什麼是undefined,0,1,1了。原因同上邊的解釋。我就不囉嗦了。

這篇說的也挺好

閉包 解決閉包問題

1 函式和對其周圍狀態 lexical environment,詞法環境 的引用 在一起構成閉包 closure 2 函式與函式所依賴的上下文環境組成閉包問題。3 閉包指的是 能夠訪問另乙個函式作用域的變數的函式。清晰的講 閉包就是乙個函式,這個函式能夠訪問其他函式的作用域中的變數。var arr ...

js的閉包問題

首先我們需要了解閉包,了解閉包就要了解全域性變數和區域性變數。在之前的js相關部落格中,已經提到過全域性變數和區域性變數。全域性變數是在整個js的作用範圍,還要了解在定義全域性變數時,它前面的關鍵字是可以省略的。而區域性變數作用範圍只是在當前的作用域。我們在呼叫區域性變數時要使用到return語句,...

javascript 閉包問題

函式的閉包 有權訪問另乙個函式作用域中的變數的函式。常見方式 在乙個函式內部建立另乙個函式。function createcomparisonfunction propertuname else 閉包只能取得包含函式中任何變數的最後乙個值。閉包所儲存的是整個變數物件,而不是某個特殊的值。functi...