构造函数"创建" JS中的无限循环

时间:2018-04-04 12:01:29

标签: javascript

我注意到构造函数中有一些奇怪的行为。这段代码无限循环,我不知道为什么。



function thing(){
    this.start=function (){console.log(this.msg)};
    this.msg="Starting...";
    setInterval(() => {this.start()},1000)
}

<button onclick="new thing()">Create a new thing!</button>
&#13;
&#13;
&#13;

我已经搜索了这个,但我发现没有解释这一点。请有人帮助我并回答为什么会这样。

感谢。

5 个答案:

答案 0 :(得分:2)

您确定要使用 FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref= database.getReference(); database.setPersistenceEnabled(true); ref.keepSynced(true); ref.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot != null) { long version = (long) dataSnapshot.child("version").getValue(); // This is the value which doesn't update for the first time. } } @Override public void onCancelled(DatabaseError databaseError) { } }); 而不是setInterval吗?前者将每1秒调用setTimeout,而后者将在1秒后调用一次, 请查看以下链接,解释这两个功能:

  1. this.start https://developer.mozilla.org/pl/docs/Web/API/Window/setInterval

  2. setInterval https://developer.mozilla.org/pl/docs/Web/API/Window/setTimeout

  3. 正确的片段应该是:

    &#13;
    &#13;
    setTimeout
    &#13;
    function thing(){
        this.start=function (){console.log(this.msg)};
        this.msg="Starting...";
        setTimeout(this.start(), 1000)
    }
    &#13;
    &#13;
    &#13;

答案 1 :(得分:1)

这是因为setInterval()设置了......你已经猜到了! Interval,它会按照您设置的时间间隔继续执行它的内容(在此示例中为1000ms)。

setTimeout()将在设定的延迟时间延迟执行一次。

答案 2 :(得分:1)

是setInterval将在1秒后调用,因此如果你想停止需要使用clearInterval。

答案 3 :(得分:1)

来自W3School文档:

  

定义和用法

     

setInterval()方法以指定的时间间隔(以毫秒为单位)调用函数或计算表达式。

     

setInterval()方法将继续调用该函数,直到调用clearInterval()或窗口关闭。

     

setInterval()返回的ID值用作clearInterval()方法的参数。

     

提示:1000毫秒= 1秒。

     

提示:要在指定的毫秒数后执行一次函数,请使用setTimeout()方法。

所以你可能想要这样做:

&#13;
&#13;
function thing(){
    this.start=function (){console.log(this.msg)};
    this.msg="Starting...";
    setTimeout(() => {this.start()}, 1000)
}
&#13;
<button onclick="new thing()">Create a new thing!</button>
&#13;
&#13;
&#13;

答案 4 :(得分:1)

setInterval实际上应该启动一个间隔(定时循环)。

此外,您正在执行该功能而不是绑定它:)常见错误。

onclick="new thing()"

https://developer.mozilla.org/de/docs/Web/API/WindowTimers/setInterval

您的代码可以更简单地完成:

const start = () => setTimeout( () => console.log(200), 1000)

<button onclick="start">Start!</button>

在大多数情况下,您不需要JS中的对象。作为第一类对象的函数是JS的一个非常强大的功能。