【问题标题】:Scope when iterating over object in CoffeeScript [duplicate]在 CoffeeScript 中迭代对象时的作用域 [重复]
【发布时间】:2013-03-21 11:42:21
【问题描述】:

在对咖啡脚本中的对象进行迭代时,我遇到了范围问题。我在遍历数组时遇到了类似的问题,但能够使用 forEach 解决这个问题,这为每个循环提供了一个新的范围。现在我遇到了类似的问题,除了不是数组,这次我使用的是对象/字典。问题是,在循环对象时,最后一个 console.log 总是返回对象中最后一个人的数据,对于所有的人。我认为这是一个范围界定问题,但我不确定如何解决。

for name, data of people
    console.log name
    lookup name, (err, other_data) ->
        console.log data  # this always returns the data for the last person

【问题讨论】:

    标签: javascript coffeescript


    【解决方案1】:

    使用do block

    for name, data of people
        console.log name
        do (data) ->
            lookup name, (err, other_data) ->
                console.log data
    

    【讨论】:

      【解决方案2】:

      Ionut 的回答是正确的,我投了赞成票。

      进一步解释一下,您遇到的问题是因为您传递的回调函数正在以某种方式异步运行。所以你的循环一直运行,最后的数据被设置为其最终值。然后异步回调一个接一个地运行,并访问数据对象。由于循环一直运行,因此数据始终等于最终值并被记录。

      do 块通过提供闭包的简写来解决问题。 Ionut 建议的代码在 Javascript 中转换为以下内容:

      var data, name, _fn;
      
      _fn = function(data) {
        return lookup(name, function(err, other_data) {
          return console.log(data);
        });
      };
      for (name in people) {
        data = people[name];
        console.log(name);
        _fn(data);
      }
      

      所以在这种情况下,数据被传递到一个闭包函数中,该函数将当前值保留在其范围内,并返回查找函数,该函数随后维护对闭包范围内值的引用。

      【讨论】:

        猜你喜欢
        • 2016-06-09
        • 2011-09-18
        • 2015-10-08
        • 2017-05-02
        • 2014-04-16
        • 2014-07-12
        相关资源
        最近更新 更多