【问题标题】:behavior of javascript 'this' keyword in closure [duplicate]闭包中javascript“this”关键字的行为[重复]
【发布时间】:2018-09-26 13:41:23
【问题描述】:

考虑一个简单的模式,我们在循环中调用 setTimeout 来打印循环计数器:

function g(i){
    return function()
    {
        console.log(i);
    }
}

for(i=0;i<4;i++)
{
    setTimeout(g(i),3000);
}

这会返回预期的结果:

0
1
2
3

根据我的理解,这个函数应该做同样的事情

function f(i){
    this.n = i;
    return function()
    {
        console.log(this.n);
    }
}

for(i=0;i<4;i++)
{
    setTimeout(f(i),3000);
}

相反,我在 NodeJS 中得到了不同的结果:

undefined
undefined
undefined
undefined

在谷歌浏览器中:

3
3
3
3

这些结果对我来说都没有意义,所以我希望其他人可以向我解释这一点。

【问题讨论】:

  • 没有。 var n = i;console.log(n) 会起作用的。 this 是完全不同的动物。
  • 为什么不调用构造函数就使用this?你期望会发生什么?请注意,您的代码将进入严格模式。你应该使用严格模式。

标签: javascript closures


【解决方案1】:

您可以使用箭头函数来保存您的 this:

function g(i){
    return () =>
    {
        console.log(i);
    }
}

for(i=0;i<4;i++)
{
    setTimeout(g(i),3000);
}

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2013-03-20
    • 2011-04-22
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多