javascript - 在对象原型(prototype)方法中的 setInterval/setTimeout 中引用 "this"

标签 javascript scope lexical-scope

<分区>

通常我会在 setInterval 中引用“this”时分配一个替代的“self”引用。是否有可能在原型(prototype)方法的上下文中完成类似的事情?以下代码错误。

function Foo() {}
Foo.prototype = {
    bar: function () {
        this.baz();
    },
    baz: function () {
        this.draw();
        requestAnimFrame(this.baz);
    }
};

最佳答案

与 Python 等语言不同,Javascript 方法会在您提取它并将其传递到其他地方后忘记它是一个方法。你也可以

将方法调用包装在一个匿名函数中

这样,访问 baz 属性和调用它是同时发生的,这是在方法调用中正确设置 this 所必需的。

您需要将来自外部函数的 this 保存在辅助变量中,因为内部函数将引用不同的 this 对象。

var that = this;
setInterval(function(){
    return that.baz();
}, 1000);

将方法调用包装在一个粗箭头函数中

在实现 arrow functions 的 Javascript 实现中功能,可以使用粗箭头语法以更简洁的方式编写上述解决方案:

setInterval( () => this.baz(), 1000 );

粗箭头匿名函数保留周围函数中的 this,因此无需使用 var that = this 技巧。要查看您是否可以使用此功能,请查阅兼容性表,如 this one .

使用绑定(bind)函数

最后一个替代方法是使用函数,例如 Function.prototype.bind 或您最喜欢的 Javascript 库中的等效函数。

setInterval( this.baz.bind(this), 1000 );

//dojo toolkit example:
setInterval( dojo.hitch(this, 'baz'), 100);

关于javascript - 在对象原型(prototype)方法中的 setInterval/setTimeout 中引用 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7890685/

相关文章:

javascript - 使用 ES6 的 AngularJs Controller 中的服务调用

java - 通过引用将对象传递给构造函数

JavaScript map 阴影

lisp - 一般来说, "lexical and special variable"语义是如何在幕后实现的?

javascript - 有TDZ为什么要提升变量

javascript - rails : Form partial not clearing/reloading after AJAX submission

php - 使用配置文件中的值从配置文件加载数据

javascript - knockout 嵌套对象范围未定义引用

javascript - 丢弃的元素不可见

c++ - 如何使大量现有功能在类的范围内可用?