web-dev-qa-db-ja.com

window.setTimeout()とsetTimeout()の違いは何ですか?

違いは何ですか?

window.setTimeout(myFancyFunciton, 1000); 

そして

setTimeout(myFancyFunciton, 1000);

どちらもまったく同じことをしているようです。いつどちらを使うべきですか?

24
user3073240

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()を呼び出すことができます。それはすべて同じオブジェクトの同じメソッドです。

32
Oswald

ブラウザベースのJavaScriptについて話していると仮定すると、違いはありません。 setTimeout()は単に_window._を省略します。これは暗黙です。それらが持つ効果はまったく同じです。

それはコーディングスタイルと好みの選択です。

ブラウザで実行されないJavaScriptの場合、windowオブジェクトが定義されていないため、window.setTimeout()は失敗します。ただし、setTimeout()は機能します。

12
Madara's Ghost

から 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は定義されていません。

2
Luca Rainone

まったく同じです。指定しない場合、ウィンドウは暗黙的です。重複の可能性を確認してください。

ウィンドウオブジェクトの前にsetTimeoutとsetIntervalを追加する必要がありますか?

1
Alex Shilman

このトピックに関連する問題に直面しました。 SPAの一部の機能をサーバー側のレンダリングプロセスの一部にしようとしました。 setTimeoutを使用して、UIでいくつかの遅延アクションを提供しました。サーバー側(NodeJS)で動作する場合、クライアント側とは関係なく、サーバー側で遅延アクションに変わります。これはブラウザsetTimeout(たとえばwindow.setTimeout)はNodeJS setTimeoutと同じではありません。クライアント側とサーバー側の両方のレンダリングに単一のsetTimeoutを使用することを禁止するさまざまなランタイム環境とは別に、 Browser および NodeJssetTimeoutは異なり、戻り値も異なります...今私はいくつかの回避策を探しています。

0
dhilt