【问题标题】:JavaScript setInterval scope issue: an alternative to bindJavaScript setInterval 范围问题:bind 的替代方法
【发布时间】:2013-10-09 11:36:21
【问题描述】:

我只是使用 bind 方法纠正了我的 JavaScript 类中的一个范围问题,该方法将 setInterval 调用的函数置于正确的范围内。但是它接缝绑定已经很早了(我认为是 1.8.4),我担心浏览器的兼容性。

还有其他较旧的选择吗?我应该忘记旧浏览器吗?

例子:

function MyClass(SomeText){
  this.text = SomeText;
}

MyClass.prototype.test = function(){
  console.log("The text: "+this.text);
}

MyClass.prototype.initialize = function(){
  setInterval(this.test.bind(this), 1000);
}

var Test = new MyClass("my thoughts");
Test.initialize();

【问题讨论】:

    标签: javascript class scope setinterval


    【解决方案1】:

    替代方案是一个很好的闭包:

    MyClass.prototype.initialize = function(){
        var myClassInstance = this;
        setInterval(function() {
            myClassInstance.test()
        }, 1000);
    }
    

    不是很漂亮,但可以跨浏览器使用。

    如果您想要类似于绑定的东西,您可以创建自己的函数来执行此操作,或使用the polyfill found at MDN。如果你使用的是 jQuery,你可以使用$.proxy,它做同样的事情。

    【讨论】:

    • +1 击败我 15 秒。如果您使用 jQuery,则有 $.proxy。还有一个bind polyfill MDN
    • 谢谢,为了完整起见,将您评论中的信息添加到答案中。
    • 所以这是一个原型使用限制,如果我们想让它在旧浏览器中工作。谢谢。
    • @GustavoPinent 这是 Function.prototype.bind 的一个限制,它在旧版浏览器上不可用。它与是否在您的类上使用原型方法无关。事实上,实例自己的方法也会出现同样的问题。
    • 我不明白你的意思,如果绑定不可用,你不能在这种情况下使用原型,对吧?
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 2021-02-27
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多