我试图理解为什么这个警告是真的?以及如何在不将参数传递给回调函数的情况下警告false(如果可能的话)?
var a = true;
function foo(callback){
var a = false;
callback();
}
function bar(){
alert(a);
}
foo(bar); // Alerts true
答案 0 :(得分:3)
由于您在说var
时使用a = false
,因此您创建了一个新的本地范围a
。
如果要在更广泛的范围内修改现有变量,请删除var
。
答案 1 :(得分:0)
此:
var a = false;
...是foo
函数范围的本地。
此:
function bar(){
alert(a);
}
...是在a = true
的变量范围中创建的,因此,关闭了该局部变量环境,从而关闭了特定的a
变量。
归结为这样一个事实:无论何时创建一个函数,都会永久保留创建它的变量范围。
将该功能传递到另一个环境并不重要。它始终只会引用其原始变量环境。
var test0 = 0; // global variable environment
function a() {
var test1 = 1; // "a()" will always retain the global environment even if you
// send "a()" somewhere else
function b() {
var test2 = 2; // "b()" will always retain the environment of "a()" and the
// global environment, even if you send "b()" somewhere else
}
}
修改强>
为了bar
引用foo
的本地变量,您可以将它们作为参数传递给bar
:
var a = true;
function foo(callback){
var a = false;
callback( a );
}
function bar( a ){
alert( a );
}
foo(bar); // now it alerts false
示例: http://jsfiddle.net/dSZ4M/
...您会注意到我在bar()
中给出了与全局a
变量同名的参数。因为在函数自己的变量环境之外的变量之前读取函数的参数,所以a
参数“shadow”全局a
变量。
因此,您无法再从a
内部阅读全局bar
。当然,您需要做的就是将参数的名称更改为其他名称,例如arg
或其他,然后您就可以引用本地arg
参数和全局a
变量。