当前位置: 首页 > 面试题库 >

在对象原型方法的setInterval / setTimeout内部引用“ this”

包和泰
2023-03-14
问题内容

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

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

问题答案:

与Python之类的语言不同,Javascript方法忘记了将其提取并传递到其他地方后才使用的方法。你可以

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

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

您将需要this将外部函数中的from 保存到一个辅助变量中,因为内部函数将引用另一个this对象。

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

将方法调用包装在粗箭头功能内

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

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

粗箭头匿名函数保留了this周围函数的,因此无需使用该varthat=this技巧。要看到,如果你可以使用此功能,请咨询兼容性表像这一个。

使用绑定功能

最后一种选择是使用诸如Function.prototype.bind之类的函数或您喜欢的Javascript库中的等效函数。

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

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


 类似资料:
  • 由于 JavaScript 是异步的,可以使用 setTimeout 和 setInterval 来计划执行函数。 注意: 定时处理不是 ECMAScript 的标准,它们在 DOM (文档对象模型) 被实现。 function foo() {} var id = setTimeout(foo, 1000); // 返回一个大于零的数字 当 setTimeout 被调用时,它会返回一个 ID 标

  • 问题内容: 据我所知,这两段JavaScript的行为方式相同: 选项A: 选项B: 使用setTimeout和setInterval之间有什么区别? 问题答案: 他们本质上试图做同样的事情,但是这种方法比该方法更加准确,因为要等待1000ms,然后运行该函数,然后设置另一个超时。因此,等待时间实际上超过了1000毫秒(如果函数执行时间较长,则等待时间会更长)。 尽管有人可能会认为将执行完全相同每

  • 本文向大家介绍用setTimeout来实现setInterval?相关面试题,主要包含被问及用setTimeout来实现setInterval?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: (1)用setTimeout()方法来模拟setInterval()与setInterval()之间的什么区别? 首先来看setInterval的缺陷,使用setInterval()创建的定时器确保了

  • 在这部分内容的第一章中,我们提到了设置原型的现代方法。 __proto__ 被认为是过时且不推荐使用的(deprecated),这里的不推荐使用是指 JavaScript 规范中规定,proto 必须仅在浏览器环境下才能得到支持。 现代的方法有: Object.create(proto, [descriptors]) —— 利用给定的 proto 作为 [[Prototype]] 和可选的属性描述

  • 你可能会觉得只读属性是只读的所以调用者不能修改它。不幸的是,这并不总是奏效的方法。如果你的属性返回引用类型,调用者可以访问任何 public 的对象成员,包括那些能修改属性状态。例如: public class MyBusinessObject { // Read Only property providing access to a // private data membe

  • 问题内容: 之间的主要区别是什么 setInterval 和 setTimeout 在JavaScript中? 问题答案: 超时后运行一次代码/函数。 以一定的间隔运行代码/函数,并在它们之间超时。 例: