0

我将首先用一个简单的例子来解释我在这里尝试做什么。

  1. 创建一个局部范围变量id并给它一个值x
  2. 创建一个函数表达式,在其中我通过alert(a)打印出值x ;并将该函数作为变量fn存储在全局列表中。
  3. 修改id以表示值y
  4. 调用fn(); 通过我的全局列表并为我打印出x 。

现在的问题是fn()打印的值是y而不是最初分配给id的x。我首先通过处理临时全局变量找到了一个解决方案,但随着项目的发展,它根本不再起作用。我不再有必要的手段来跟踪这些全球临时工。

任何帮助我指出正确方向的帮助将不胜感激。如果之前已经回答过这个问题,我深表歉意。也许我只是不太擅长搜索网络,但我还没有找到一个令人满意的。

注意:我也许应该补充一点,与我提到变量范围的次数相反,这不是问题。局部变量似乎以某种方式被全局处理(或者可能创建了指向它的全局指针?),因为当以上述方式完成时,从其他范围打印局部变量没有问题。

这是我想要的代码示例(我认为这种方式比使用我自己的代码更清晰):

var fnList = []
function FunctionA(){
    for(var i = 0; i < 10; i++){
        var iToFunctionExpression = i; // this is where I want to somehow send my variable to the function
        fnList.push(function(){
            alert(iToFunctionExpression);
        });
    }
}
function FunctionB(){
    for(var i = 10; i < 20; i++){
        var iToFunctionExpression = i; // this is where I want to somehow send my variable to the function
        fnList.push(function(){
            alert(iToFunctionExpression);
        });
    }
}
function FunctionPrintAB(){
    for(var fn = 0; fn < fnList.length; fn++){
        fnList[fn](); // here I want to alert the numbers 0 through 19
    }
}

此致。

4

1 回答 1

1

你需要建立一个闭包:

var x = 1;

function makealerter(i) {
    return function() {
        alert(i);
    }
}

var fn = makealerter(x);

var y = 2;

fn();

x = y;

fn();
于 2013-10-08T23:01:46.430 回答