【问题标题】:Why doesn't the variable stay when I am using the setTimeout method? [duplicate]为什么当我使用 setTimeout 方法时变量没有保留? [复制]
【发布时间】:2017-01-28 11:04:08
【问题描述】:
var obj = {
    id: 1,
    getId: function(){
        console.log(this.id)
    }
}

obj.getId(); // 1

setTimeout(obj.getId, 1000); // undefined

所以我试图理解直接调用该方法效果很好,但是当我使用 setTimeout 方法调用它时,范围不知何故消失了。这是为什么?这是语言的缺陷还是在幕后发生了我完全不理解的其他事情。

我什至在getId 方法中尝试了var self = this;,但它仍然会说self.id 未定义。怎么回事?

PS:我正在使用 node v6.5.0 来运行这段代码。

【问题讨论】:

    标签: javascript scopes lexical-scope


    【解决方案1】:

    以这种方式传递函数引用时,您将丢失 ThisBinding(函数内部 this 的值)。

    改为传递obj.getId.bind(obj)

    setTimeout(obj.getId.bind(obj), 1000); 
    

    把它想象成内存中有一堆函数,如果你用obj.getId()调用一个函数,你就是在告诉它传递obj作为它的ThisBinding。

    然而,如果你只传递obj.getId,你只是给它一个对某个函数的函数引用,它不知道它应该使用哪个对象作为上下文(所以它会默认为全局对象)。使用Function.prototype.bind() 可以锁定ThisBinding 到您的选择。

    【讨论】:

    • 所以你的意思是如果我在对象外做var id=2,程序应该输出2,对吧?
    • @Rohan 是的,如果你在全局范围内声明它。
    • 我试过了,它仍然显示未定义。这就是我更加困惑的原因。
    • 在全局范围内尝试this.id = 2
    • @Rohan 如果您在全局范围内定义变量,它应该可以工作,它将被添加到窗口对象中。检查这个小提琴jsfiddle.net/y79ejLh4/1
    猜你喜欢
    • 2019-07-07
    • 2023-03-13
    • 1970-01-01
    • 2012-02-23
    • 2011-02-15
    • 1970-01-01
    • 2021-09-30
    • 2011-10-31
    相关资源
    最近更新 更多