javascript – 在setTimeout上更改匿名函数的范围会导致奇怪的警告
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 在setTimeout上更改匿名函数的范围会导致奇怪的警告,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1557字,纯文字阅读大概需要3分钟。
内容图文
![javascript – 在setTimeout上更改匿名函数的范围会导致奇怪的警告](/upload/InfoBanner/zyjiaocheng/757/9b7cdc6630784b15bc8327e3c3d720b3.jpg)
这让我对纯粹的研究和个人发展感兴趣.我有一组命名空间的函数/变量.
在1个函数中我需要通过setTimeout调用另一个函数但是将范围保持为’this’.我正在努力解决这个问题,似乎无法在setTimeout运行时绑定它.
var foo = {
ads: ["foo","bar"],
timeDelay: 3,
loadAds: function() {
var al = this.ads.length;
if (!al)
return; // no ads
for(var i = 0; i < al; i++) {
setTimeout(function() {
this.scrollAd(this.ads[i]);
}.apply(this), this.timeDelay * 1000);
}
},
scrollAd: function(adBlock) {
console.log(adBlock);
}
};
};
.apply(this)DOES更改范围,因为console.log输出正确的对象,但它会立即运行该函数,然后在回调保持为空时出现异常/警告:
useless setTimeout call (missing quotes around argument?)
这样做有一种优雅的方式吗?我知道我能做到
var _this = this;
并在anon回调中引用_this.例如,在mootools我会使用.bind(this)代替……
不,因为这涉及动画,我不想在字符串周围使用“”,因为它需要进行评估并会影响性能……
解决方法:
for(var i = 0; i < al; i++) {
setTimeout(function() {
this.scrollAd(this.ads[i]);
}.apply(this), this.timeDelay * 1000);
}
apply不绑定函数,它调用它.因此,您立即执行滚动,然后将其返回值(未定义)传递给setTimeout,这是无效的.
你可能打算在这个和循环变量上使用这样的闭包(必须关闭它或者它将是相同的,每个超时的循环后值):
for(var i = 0; i < al; i++) {
setTimeout(function(that, j) {
return function() {
that.scrollAd(that.ads[j]);
};
}(this, i), this.timeDelay * 1000);
}
但是,您可能更喜欢使用新的ECMAScript第五版功能绑定功能,该功能具有更紧凑的语法:
for (var i= 0; i<al; i++)
setTimeout(this.scrollAd.bind(this, this.ads[i]), this.timeDelay*1000);
(对于没有在this answer底部本身拥有它的浏览器,有一个function.bind的实现.)
内容总结
以上是互联网集市为您收集整理的javascript – 在setTimeout上更改匿名函数的范围会导致奇怪的警告全部内容,希望文章能够帮你解决javascript – 在setTimeout上更改匿名函数的范围会导致奇怪的警告所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。