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

Setting the scope of a callback to where it is executed?

本文关键字:回调 执行 位置 范围 设置      更新时间:2023-09-26

我试图理解为什么这会报警为true?如果可能的话,我如何在不向回调函数传递参数的情况下发出false警报?

var a = true;
function foo(callback){
    var a = false;
    callback();
}
function bar(){
    alert(a);
}
foo(bar); // Alerts true

由于在说a = false时使用var,因此创建了一个新的、本地作用域的a

如果您想在更大的范围内修改现有的变量,请去掉var

这:

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参数"阴影">是全局a变量。

因此,您无法再从bar内部读取全局a。当然,您所需要做的就是将参数的名称更改为其他名称,如arg或其他什么,然后您就可以引用局部arg参数和全局a变量。