0

假设我有一个代码片段:

dict = {"key":"elem"}
for (var elem in dict){
    someFunction(function(){
        anotherFunction(dict[elem]);
    })
}

在第三级(即 at )引用它时,是否仍然在语句中elem创建该临时变量?for...in...anotherFunction(dict[elem])

在我的代码中调用它时,我收到一条错误消息,指出它返回未定义。

编辑:我可以在this某处用关键字解决这个问题吗?

4

4 回答 4

1

您正在对匿名函数创建一个闭包,因此它取决于您在设置它和使用它之间对变量所做的操作。

var dict = {
    "a": "aaaaaaaaa",
    "b": "bbbbbbbbb",
    "c": "ccccccccc"
};

for (var elem in dict) {
    someFunction(function() {
        anotherFunction(dict[elem]);
    })
}

function anotherFunction(a) {
    console.log(a);
}

异步:循环在实际执行代码之前运行,因此elem最终成为集合中的最后一个键。最后一个键被多次使用。

function someFunction(f) {   
    setTimeout(f, 500);
}

同步:每个函数按顺序运行,因此每个值都会被打印出来

function someFunction(f) {
    f();
}
于 2012-07-02T23:06:29.960 回答
0

elem定义你的问题是:

dict[elem]

返回undefind

于 2012-07-02T22:55:19.850 回答
0

如果您在任何语句中创建变量,该变量仍将作用于最近的父函数,这就是 JavaScript 的工作方式。范围是函数。你应该可以在elem那里使用,所以你的问题一定是gdoron所说的其他地方。

编辑:

似乎您正在调用一个将另一个函数作为参数的函数。这真的是你想做的吗?

于 2012-07-02T22:58:36.010 回答
0

要将dict变量用作 的范围anotherFunction,您需要将其引用dict为该函数的范围。例子:

for (var elem in dict) {
  someFunction(function(dict, elem) {
    return anotherFunction.call(dict, elem);
  }
}

在您的anotherFunction结构中,this关键字的使用将引用该dict对象。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

于 2012-07-02T23:04:44.533 回答