javascript setTimeout 调用错误

发布于 2024-11-09 21:08:40 字数 700 浏览 4 评论 0原文

我想调用 window.setTimeot 函数我的自定义范围,因此我使用 call方法,但是有问题。

function foo() {
    this.bar = function() {
        console.log("keep going");
        window.setTimeout.call(this,this.bar,100);
    }
    this.bar();
}

new foo;

在 Firefox 下,这只会打印到控制台 1 行,然后什么也不打印,而在 google chrome 下,它会抛出 类型错误

我的代码有什么问题?

I want to invoke the window.setTimeot function with my custom scope so I use the call method, but there is something wrong.

function foo() {
    this.bar = function() {
        console.log("keep going");
        window.setTimeout.call(this,this.bar,100);
    }
    this.bar();
}

new foo;

under Firefox this prints to the console only 1 line and then nothing, and under google chrome it throws a TypeError.

What is the problem in my code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明天过后 2024-11-16 21:08:40

使用 call 在这里没有帮助:它使用 this 对象调用 setTimeout,但回调函数本身仍然是从全局范围调用的。您真正想做的是这样的:

function foo() {
    var self = this;
    this.bar = function() {
        console.log("keep going");
        window.setTimeout(function() { self.bar(); }, 100);
    }
    this.bar();
}

编辑: 如果您确实想要类似于 call 方法,您可以使用 bind 绑定 this 值function:

window.setTimeout(this.bar.bind(this), 100);

但是,这是新的 ECMAScript 5 规范的一部分,尚未得到所有浏览器的支持。

Using call does not help here: it calls setTimeout with your this object, but the callback function itself is still called from the global scope. What you really want to do is something like this:

function foo() {
    var self = this;
    this.bar = function() {
        console.log("keep going");
        window.setTimeout(function() { self.bar(); }, 100);
    }
    this.bar();
}

Edit: If you really want something similar to the call approach, you can use bind which binds the this value for a function:

window.setTimeout(this.bar.bind(this), 100);

However, this is part of the new ECMAScript 5 spec which is not yet supported by all browsers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文