2017-10-22 13 views
-3

私はJSに新たなんだ、それは2つの機能とループのようなものを作成することが可能だ場合、私はちょうど疑問に思う..例:私がしようとすると、コール無限javascript関数

function a() { 
    var myvar =1; 
    b(); 
} 
function b(){ 
    var myvar =2; 
    a(); 
} 
a(); 

が、私はこの結果を得ます"キャッチしないSyntaxError:予期しない入力の終了"

+2

はい、可能です。あなたはそれを試していない? – Bergi

+0

(もちろん、ここで示したコードは無限ループです。何もうまく行かず、再帰的な実装ではスタックオーバーフローが発生します) – Bergi

+0

スタックオーバーフローのためRangeErrorがスローされます。 – Eisenheim

答えて

0

を参照してください、しかし、心に留めておくべきいくつかの事柄があります:

  • これはメモリリークが発生することがあり、そして、ユーザーのブラウザを遅くすることができます
  • 遅延を伴わない2つの関数間のループは最大スタックサイズを超えます。

setIntervalを使用することもできますが、それほど柔軟性はありません。私が使用したい

機能は少しのように書かれている:

(function(delay, callback){ 
    var loop = function(){ 
     callback(); 
     setTimeout(loop, delay); 
    }; loop(); 
})(1000, function(){console.log('Hello World!')}); 

それはすべての1000ミリ秒、または1秒を'Hello World!'記録します。すべての二つの機能を呼び出すには

function loopFunction(delay, callback){ 
    var loop = function(){ 
     callback(); 
     setTimeout(loop, delay); 
    }; loop(); 
}; 

loopFunction(1000, function(){console.log('Hello World!')}); 

:まだ

function sayHello(){ 
    console.log('Hello World!'); 
    setTimeout(sayHello, 1000); 
}; sayHello(); 

..or良く、恒久的な解決策:これを行うには

もう一つの方法は、このように、単にタイムアウトに自分自身を参照することですトグルスイッチを作成するか、ちょっと後にsetTimeoutで2番目の関数を呼び出すことができます。

0

あなたが試みている方法は、潜在的なメモリリークの危険性が非常に高いです。

使用する方法は、setIntervalを呼び出して行います。ここで、3000は各反復の前のミリ秒数を意味します。

setInterval(
    function(){ 
     alert("Hello"); 
    }, 
    3000 
); 

はい、あなたがこれを行うことができますhttps://www.w3schools.com/jsref/met_win_setinterval.asp