2012-07-02 108 views
0

说我有一个代码片段:Javascript中的变量范围在“for ... in ...”循环中吗?

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

elem仍当在该第三级引用在for...in...语句创建的临时变量,即在anotherFunction(dict[elem])

当它在我的代码中被调用时,我得到一个错误,说它返回undefined。

编辑:我可以以某种方式解决这个与this关键字的地方?

+0

甲环不具有一个范围的概念。什么是“dict”变量?对象还是数组? – rxgx

+1

只有一个名为'elem'的**变量 - 这对于它在使用地点评估的*值*意味着什么? (提示:*只有新的函数范围可以引入新的变量*。)查找“javascript循环最后值闭包”或类似内容。 – 2012-07-02 22:55:56

+0

你的编辑是无稽之谈,它怎么能用'this'修复一些? – gdoron

回答

0

elem定义你的问题是:

dict[elem] 

回报undefind

0

如果您创建变量仍然会作用域到最近的父功能的语句中的变量,这是JavaScript的是如何工作的。范围是功能。你应该可以在那里使用elem尽管如此,你的问题必须在其他地方gdoron说。

编辑:

看来你调用一个函数,另一个函数作为参数。那真的是你想要做的吗?

+0

第一部分是对的。我怀疑这个问题与不理解(或者没有正确的数据,或者没有使用词法变量或...)有关, – 2012-07-02 23:01:29

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(); 
}