【问题标题】:javascript setTimeout call errorjavascript setTimeout 调用错误
【发布时间】:2011-09-01 00:34:51
【问题描述】:

我想用我的自定义作用域调用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 下它会抛出一个 TypeError

我的代码有什么问题?

【问题讨论】:

    标签: javascript scope call settimeout invoke


    【解决方案1】:

    在这里使用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 值:

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

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

    【讨论】:

    • 谢谢,我知道这种方式可行,我正在尝试使用call
    • @omnosis:您不能为此目的使用call。您正在寻找的是bind,它是新 ECMAScript 5 规范的一部分。使用它,您可以执行以下操作:window.setTimeout(this.bar.bind(this), 100).
    • 非常有意义。我犯了同样的错误,在setTimeout 上使用call 毫无意义,因为您不是要更改setTimeoutthis,而是要更改作为参数传递的函数。欢呼
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多