違いは何ですか?
window.setTimeout(myFancyFunciton, 1000);
そして
setTimeout(myFancyFunciton, 1000);
どちらもまったく同じことをしているようです。いつどちらを使うべきですか?
JavaScriptは、グローバルオブジェクトで定義された環境で実行されます。グローバルオブジェクトのメソッドは、オブジェクトを明示的に参照せずに(つまり、obj.function()
表記なしで)呼び出すことができます。
ブラウザ内でJavaScriptを実行すると、グローバルオブジェクトはドキュメントオブジェクトモデル(DOM)によって提供されます。 DOMのグローバルオブジェクトには、メソッドsetTimeout()
があります。そのため、setTimeout()
を呼び出すことができます。
DOMは、グローバルオブジェクトにwindow
という名前のプロパティがあることを指定します。これは、グローバルオブジェクトへの参照です。そのため、window.setTimeout()
および(推移性によって)window.window.setTimeout()
、window.window.window.setTimeout()
、および(ご想像のとおり)window.window.window.window.window.window.window.window.window.setTimeout()
を呼び出すことができます。それはすべて同じオブジェクトの同じメソッドです。
ブラウザベースのJavaScriptについて話していると仮定すると、違いはありません。 setTimeout()
は単に_window.
_を省略します。これは暗黙です。それらが持つ効果はまったく同じです。
それはコーディングスタイルと好みの選択です。
ブラウザで実行されないJavaScriptの場合、window
オブジェクトが定義されていないため、window.setTimeout()
は失敗します。ただし、setTimeout()
は機能します。
から https://developer.mozilla.org/en-US/docs/Web/API/Window
ウィンドウオブジェクトは、ウィンドウ自体を表します。
したがって、呼び出すすべての変数と関数は、オブジェクトウィンドウ内に含まれています。ただし、関数または変数を呼び出すたびにオブジェクト参照を省略できます。
なぜこれ? 2つ以上のフレームがあるページについて考えてみてください。すべてのフレームには独自のwindow
があります。ターゲットのwindow
オブジェクトにアクセスするだけで、別のフレームからフレーム内の変数にアクセスできます。これは、グローバルとして宣言されたすべての変数または関数に有効です...また、setTimeout
などのネイティブ関数にも有効です。
では、なぜ時々明示的にwindow.setTimeout
を書く必要があるのでしょうか?
単純に、スコープ内にいて、ネイティブ関数と同じ名前を使用している場合は、使用する関数を選択できます。
例えば:
function myF() {
function setTimeout(callback,seconds) {
// call the native setTimeout function
return window.setTimeout(callback,seconds*1000);
}
// call your own setTimeout function (with seconds instead of milliseconds)
setTimeout(function() {console.log("hi"); },3);
}
myF();
オブジェクトwindow
はブラウザ環境にのみ存在することに注意してください。 Node.js
のグローバルオブジェクトはglobal
であり、window
は定義されていません。
まったく同じです。指定しない場合、ウィンドウは暗黙的です。重複の可能性を確認してください。
このトピックに関連する問題に直面しました。 SPAの一部の機能をサーバー側のレンダリングプロセスの一部にしようとしました。 setTimeout
を使用して、UIでいくつかの遅延アクションを提供しました。サーバー側(NodeJS)で動作する場合、クライアント側とは関係なく、サーバー側で遅延アクションに変わります。これはブラウザsetTimeout
(たとえばwindow.setTimeout
)はNodeJS setTimeout
と同じではありません。クライアント側とサーバー側の両方のレンダリングに単一のsetTimeout
を使用することを禁止するさまざまなランタイム環境とは別に、 Browser および NodeJssetTimeout
は異なり、戻り値も異なります...今私はいくつかの回避策を探しています。