调用setTimeOut's函数带有对象,出现意外结果
calling setTimeOut's function with object, unexpected result?
我正试图解决JS难题,但我不确定为什么在setTimeOut函数中使用ralph.bark不起作用(不记录ralph…)?
我们正在针对范围内的特定对象调用bark函数(而不是this.bark,它会使"this"指向window..),因此"this"应该设置为ralph,不是吗?有人能解释为什么这不起作用吗?
var Dog = function( name ) {
this.name = name;
}
Dog.prototype.bark = function() {
console.log( this.name );
}
// make a new instance of a Dog
var ralph = new Dog('Ralph');
// make Ralph bark once immediately
ralph.bark();
// in 2 second we want Ralph to bark again
// this works
setTimeout(ralph.bark.bind(ralph), 2000);
// this does not work, WHY?
// setTimeout(ralph.bark, 2000);
setTimeout(ralph.bark, 2000)
不调用ralph.bark
。它只是将函数的引用传递给setTimeout
。CCD_ 4然后在延迟之后执行该功能。当它这样做时,它将类似于callback();
,因此函数内的this
将引用window
。
MDN文档中详细解释了this
的工作原理。
也许这会让它变得更清楚:
function bark() {
console.log( this.name );
}
var Dog = function( name ) {
this.name = name;
}
Dog.prototype.bark = bark;
现在,执行setTimeout(ralph.bark, 2000);
还是setTimeout(bark, 2000);
没有区别,因为ralph.bark
和bark
指的是同一个函数。
函数是一流的对象。它们不属于或绑定到任何东西,除非您明确这样做(.bind(ralph)
)。
另请参阅:如何在回调中访问正确的"this"/上下文?
JavaScript绑定this
的方式,不能像那样传递函数。
以下情况也会发生同样的情况:
var bark = ralph.bark;
bark();
幸运的是,JavaScript有一种方法可以将函数绑定到它们的this
对象。试试这个:
setTimeout(ralph.bark.bind(ralph), 2000);
这本质上是类似以下内容的快捷方式:
setTimeout(function() { ralph.bark(); }, 2000);
有关更多信息,请参阅bind
上的MDN文章:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
- 对象拟合:获取结果尺寸
- JSON.stringify和Object.keys在同一个对象上产生不同的结果
- JQuery Deferred Ajax,将结果保存在调用对象中
- 在页面对象文件中验证sendKeys结果会导致未定义的错误(Protractor)
- 返回带有筛选结果的新JSON对象
- 使用函数for循环遍历对象以更改值,然后返回结果
- 为什么纬度结果对象从谷歌地图 API 更改
- 意外结果,在 ASP.Net 中解析 JSON 对象的数组
- jquery jqgrid 不显示结果,具体取决于 JSON 对象中的参数
- 用逗号分隔返回结果中的对象
- jQuery 循环 JSON 结果,对象作为值
- 正在调用对象中设置的匿名函数,但未得到预期结果
- 当我运行代码时,我得到以下结果 []对象对象] [对象对象],但应该给我一个有序数组
- 剑道角's自动完成在结果中显示对象
- 使用lodash'扩展JS对象实例;s的extend方法会导致奇怪的结果
- 从 $.post() 获取 JSON 对象结果
- 使用 JavaScript 将多个对象结果集的数组合并到单个数组中
- 有选择地返回JSON对象结果
- Json字符串javascript对象结果不匹配
- 提取 JSON 对象结果的某些部分