【问题标题】:Javascript ES6: Recursive function call from foreach loop fails [duplicate]Javascript ES6:来自foreach循环的递归函数调用失败[重复]
【发布时间】:2018-03-09 10:34:51
【问题描述】:

我是 JavaScript 新手。

class ExpansionPath {
    expandPipelineNodes()
    {
        this.expandPipelineNode(this._rootNodes);
    }
    expandPipelineNode(node)
    {
        let bPipeline = false
        _.each(node.children,function(child){
            bPipeline |= this.expandPipelineNode(child);
        })

        ...
    }
}

当我调用函数 expandPipelineNodes 时,它调用了 expandPipelineNode(node),这很好。但是当它进入 foreach 循环时,程序就会崩溃。我已经调试了程序,它表明这在 forEach 循环中变得未定义。我还尝试了以下代码:

    node.children.forEach(function(child){
        bPipeline |= this.expandPipelineNode(child);
    })

但问题仍然存在。 如何在 javascript 中解决这个问题?

【问题讨论】:

  • 你在循环中失去了this的范围,你必须绑定它
  • 那怎么绑定呢?

标签: javascript ecmascript-6


【解决方案1】:

回调内部的范围与外部的范围不同。保留词法范围的简单方法是使用箭头函数:

_.each(node.children, (child) => {
    bPipeline |= this.expandPipelineNode(child);
})

你也可以使用Function.prototype.bind

_.each(node.children, function (child) {
    bPipeline |= this.expandPipelineNode(child);
}.bind(this))`

但这更冗长。

还有其他几种方法可以让它发挥作用,但它们在 2018 年并不酷。

【讨论】:

  • 好吧,你可以用,this替换.bind(this),但是lodash选项没有这样的功能
  • 谢谢。所以我现在读到箭头函数没有自己的 this。所以它总是保留主函数的this?
  • 是的,它有周围环境的上下文,词法。
  • 我不知道为什么有人对您的回答投了反对票。非常感谢
  • 抱歉,我没有意识到 var that = this 在 2018 年并不 ;)
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 2015-08-14
  • 2023-04-02
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
相关资源
最近更新 更多