要解決的問題是:從方法a中使用方法b裡面定義的變數
閉包:是乙個函式,能夠在函式生成時捕獲附近的「值」
-參照書本給出的閉包例子
function
b()
};function
a(s)
var b = b();
b();
輸出: 1
[finished in
0.2s]
很滿意,能修改到s的值,原因是在函式生成的時候捕獲了附近的「值」,雖然說的有點那麼不令人滿意,但是能說明問題,s被使用了。然後
...
var b = b();
b();
b();//加入3條b();
b();
b();
....
111
1[finished in 0.2s]
這就很奇怪了啊,為什麼啊,為什麼總是1啊,並應該是每次都加1嗎。我也不知道啊
var s = 10;
function
b()
....
};function
a(s)
var b = b();
b();
b();
add();
add();
add();
輸出 11
1112
3[finished in
0.2s]
這就更奇怪了,如果說b()方法每次都只能為1,那麼add方法應該也只能返回1。另外乙個問題是,注意到add方法是乙個全域性方法,如果呼叫的話,按照變數由呼叫處往上搜尋的話,應該搜尋到s的值應該為10;
結論一:由此可以看出在add函式生成的時候,產生了乙個閉包,該閉包捕獲了該函式生成的時候的s的值,即為(var s=0)。
...
var b = b();//這裡是函式生成的地方
...b();
b();
故在此處為函式b生成的地方,由於add方法也在b的裡面,所以也是add生成的地方,另外注意到,add方法為全域性方法,如果沒有var b = b();那麼函式應該也能被執行,因為在**的最開頭存在var s =10;,那麼是否是這樣的呢。**如下
var s = 10;
function
b()
return
function
() };
function
a(s)
// var b = b();
// b();
add();
add();
add();
執行結果如下:
add();
^referenceerror: add
isnot defined
結果是add方法not defined。
結論二:add方法雖然是全域性方法裡面,但是它是存在與b()中的,只有b()被執行了,才相當於add方法被定義了,否則是沒有定義的。
附:最開始自己的認為是b()方法沒有被定義,故不存在上下文。。瞎猜的,歡迎指正。
var b = b();
b();
b();
b();
add();
add();
add();
輸出11
1123
[finished in
0.2s]
又回到了最初的起點,呆呆地站在js前。。。怎麼辦。難不成這兩個用的s不是同乙個東西??果然。。
var s = 10;
function
b() ;
add = function
() return
function
() };
function
a(c)
var b = b();
b();
add();
add();
b();
add();
b();
b();
執行結果
a...
1add...
1add...
2a...
2add...
3a...
3a...
4[finished in
0.4s]
閉包:是乙個函式,能夠在函式生成時捕獲附近的「值」
如上4個結論。
javaScript中的閉包
首先,我覺得,乙個概念,如果不理解也不影響使用的話,那麼,就沒必要去理解它 去學習它。閉包就是這樣乙個概念,你不理解它也能很好的用它。俺這兩年寫as3程式,是天天在和它打交道,甚至有過乙個function套乙個,乙個方法中套了20多個function的極端例子,但從未深究過它是怎麼實現的,它就像水和...
javascript中的閉包
1.閉包的解釋 關於閉包具體的定義文獻中給的概念很抽象,我認為閉包是一種使函式能夠都去其它函式的區域性變數的語法機制。舉個例子 functionoutfunc returninfunc infunc 控制台顯示 vicfeel 這這個例子我們可以看出,在函式infunc中依然可以訪問outfunc的...
javascript中的閉包
閉包 乙個函式能夠讀取另外乙個函式裡面的變數。閉包的作用 1 讀取函式內部的變數 2 讓這個變數的值始終保持在記憶體中,不會在父函式呼叫後被自動清除。使用閉包注意事項 由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在ie中可能導致記憶體洩漏...