請看下面的例子:
var a = 100;
function afunc(infunc){
a = 10;
var f = function(){
console.log(a);
};
f.call();
infunc.call();
}
afunc(function(){ console.log(a); });
我們指定的值10到a
在afunc
的範圍內,然後依次調用兩個函數,即只記錄a
的值。在這種情況下,您會希望這兩個函數都記錄爲a
的值,實際上會發生什麼情況。
在您的示例中,infunc
將在與afunc
中定義的任何本地函數基本相同的範圍內執行,而不管它實際定義在何處。由於您在較窄的範圍內爲a
分配了值,因此在撥打infunc
時,值爲a
。
功能做保留從他們的定義一些範圍,如下面的例子:
function bfunc(){
var b = 'hello';
return function(){ console.log(b); };
}
afunc(bfunc());
這裏,bfunc
返回的匿名函數實際上是從afunc
範圍內調用,但它仍然能夠記錄在原始範圍內分配的正確值b
。如果要更改afunc
以將不同的值分配給b
,它仍會記錄"hello"
,因爲afunc
中定義的b
是與bfunc
中定義的b
中定義的變量不同的變量。
Facepalm!現在我感到很傻。 – 2012-07-20 16:31:34
是的,這是正確的原因 – 2012-07-20 16:36:01