将回调的范围设置为执行的范围?

时间:2011-07-15 21:49:46

标签: javascript

我试图理解为什么这个警告是真的?以及如何在不将参数传递给回调函数的情况下警告false(如果可能的话)?

var a = true;

function foo(callback){
    var a = false;
    callback();
}

function bar(){
    alert(a);
}
foo(bar); // Alerts true

2 个答案:

答案 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变量。