發生什麼事是您創建了一個匿名函數,它需要2個參數x和y。匿名函數立即執行。
它創建一個局部變量x
並將其指定爲空。這個例子中完全沒有意義。
,並在那裏證明參數x覆蓋本地實例化的x,並且只能使用
this
關鍵字訪問。
匿名函數然後返回一個具有屬性foo和bar的對象,這兩個函數都帶有參數x
。
什麼是最有趣的是,從匿名函數的參數y
變成「鎖定」的foo和酒吧的功能裏面,所以,當你撥打:
a.foo(4); // output 15
a.foo(2); // output 9
在上面的例子中,4傳遞到函數foo作爲參數x
。產品4和3的原始y
值在匿名函數中傳遞的是12.該產品被傳遞到條函數中,其中12被添加到相同的鎖定值y
的值3中,這會給出總和15.
foo(2)發生同樣的過程。
我的建議是使用Firebug將Firefox拉出並粘貼到控制檯並運行它。然後用不同的值調用a.foo
和a.bar
並追蹤執行情況。這將幫助你更好地理解代碼中發生了什麼。
細分功能的執行與替代:
a.foo(4);
function(4) { return this.bar(4 * 3); }
function(4) { return function(4 * 3) { return (4 * 3) + 3; } };
function(4) { return function(12) { return (12) + 3; } };
function(4) { return function(12) { return 15; });
function(4) { return 15; }
15
我也建議你看看this example of closures,但沒有匿名函數。刪除匿名組件可能有助於使其更加清晰。
其實,這裏就是你們的榜樣上面,但沒有匿名函數:
function fooBar(y,x) {
var x = null;
return {
foo: function(x){ return this.bar(x * y); },
bar: function(x){ return x + y; }
}
}
var b = fooBar(3,4);
b.foo(2); // output 9
b.foo(4); // output 15
所以在上面的例子中,fooBar(3,4)
返回一個包含兩個函數foo和酒吧的一個對象,鎖定爲3 y
參數。
JavaScript Kit - Closures 101. They're Not Magic,是另一個很好的資源,這將有助於解釋封鎖的目的,以及這意味着什麼幕後。
發生你能澄清什麼可以用這個關鍵字(2.段)訪問嗎? –
@Sime - 我要刪除那部分。我不知道的'變種的100%×= null'不是事實,這看似對的函數的結果沒有影響,無論是目前使用var,沒有VAR或完全忽略其他。 – jmort253
非常感謝您的回答,併爲我提供了關閉的鏈接。 – manraj82