2017-04-19 9 views
2

私は頭を包むことができない基本的なjavascriptの質問のように思えます。以下のコードスニペットはなぜ機能しますか(w3の学校から取得)?JavascriptはsetInterval()を変数に代入する方法をどのように扱いますか?

私が求めているのは、なぜ以下の「myVar」変数が明示的な呼び出しなしでsetIntervalメソッドを実行するのですか?私の最高の推測は、javascriptが変数の割り当てを処理する方法と関係があるということですか?

<html> 
<body> 

<p>Click the button to wait 3 seconds, then alert "Hello".</p> 
<p>After clicking away the alert box, an new alert box will appear in 3 seconds. This goes on forever...</p> 

<button onclick="myFunction()">Try it</button> 

<script> 
var myVar; 

function myFunction() { 
    myVar = setInterval(alertFunc, 3000); 
} 

function alertFunc() { 
    alert("Hello!"); 
} 
</script> 

</body> 
</html> 

任意の更なる明確化が必要とされている場合には、ここに私の現在の仕事からコードスニペットです:

var refresh = setInterval(function() { 
     $("#div").load('Query.html'); 
    }, 1000); 

だから私の質問は、なぜ他の場所で変数を「リフレッシュ」を呼び出すことなく、上記の作業を行い、あります?

+0

変数を呼び出したいですか?どうやって?変数は私たちから何かを隠しているのですか?変数には独自のメソッドがありますか? – Oen44

答えて

6

setInterval()それ自身でサイクリック呼び出しを行い(edit参照)、サイクリック呼び出しを処理するプロセスのIDを返します。戻り値を割り当てる目的は、setInterval()(=プロセスID)の戻り値をそのパラメータとして渡す必要があるため、後でclearInterval()を使用することです。

あなたがsetInterval()で渡された関数をsetIntervalを使って作成した "サイクリングコールチェーン"によって再び呼び出さないようにするには、単にclearInterval(refresh)を実行します。インライン関数(または関数ポインタ)と整数の2つのパラメータを必要とsetInterval

EDIT

。何setInterval

{integer passed}ミリ秒待機してから関数を呼び出し、あなたはsetIntervalの戻り値を渡すclearIntervalを呼び出すまで、何度も同じことをやり直すです。

+0

お返事ありがとうございます!これがsetinterval()そのものの特性か、javascriptの割り当てと関係があるのであれば、ちょっと混乱していました。今より意味をなさない。再度、感謝します! – pmcy85

+0

ようこそ。 – Vivick

1

setIntervalはすぐに機能を実行するタイマーを起動します。この関数は、後でキャンセルするためにタイマーを追跡するためのIDを返します。以下のドキュメントを参照してください。

https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/timers#setInterval(callback_ms)

+0

あなたはお互いの答えを下降させて再び子供たちと戦っていますか? – Christoph

+0

お返事ありがとうございます!これは今より多くの意味があります。 – pmcy85

-1

それは、 "明示的な呼び出しなしsetIntervalメソッドを実行" しません。明示的な呼び出しはここにある:の内部のmyVar = setInterval(alertFunc, 3000);

myvarには、電話番号setIntervalが返されます。

+0

正しい答えが得られました。かわいいね。 「本質的に私が求めているのは、以下の「myVar」変数が明示的な呼び出しなしでsetIntervalメソッドを実行するのはなぜですか? – gforce301

+0

あなたはお互いの答えを下降させて再び子供たちと戦っていますか? – Christoph

+1

また、技術的にはあなたの答えは正しくありません。後で実行される関数* reference *を渡すだけなので、すぐに関数を実行しません(少なくともあなたが答えているものです)。 – Christoph

1

myVar = setInterval(alertFunc、3000);

これはmyVarに関数変数を格納していないため、myVarに "setInerval"関数の出力を格納します。

以下のコードでは、testfunc()の戻り値をテストに割り当てるようにしています。

var test; 
function foo(){ 
    test = testfunc(); 
} 
function testfunc(){ 
    console.log("hi"); 
} 
foo(); 

あなたが

var test; 
function foo(){ 
    test = testfunc; 
} 
function testfunc(){ 
    console.log("hi"); 
} 
foo(); 

のように記述する必要がテストするtestfunc機能を割り当てたい場合、あなたは関数式/参照の定期的な実行をスケジュールします明示的

+0

これは意味があります。上記の最初のコードスニペットでは、foo()が呼び出されたときにtestfunc()がすぐに実行され、その出力が "test"に格納されるのに対し、2番目のコードスニペットでは "testfunc"明示的にtest()を呼び出しますか? – pmcy85

+0

。 Javaスクリプト関数ではオブジェクトなので、関数を呼び出して出力とストアを取得(1番目のスニペット)したり、関数を変数に直接格納することができます(2番目のスニペット) –

3

setIntervalを呼び出す必要があります最初の引数として渡され、このスケジューリングの一意の識別子が返されます。渡された関数は、Xミリ秒ごとに呼び出されます(この間隔は、setIntervalに渡される2番目の引数です)。 setIntervalを使用するには、戻り値を変数に代入する必要はありません。この識別子を保存する主な理由は、後でclearInterval(yourIntervalIdHere)を呼び出すことによってこのスケジューリングをキャンセルすることです。

関連する問題