19

グローバル変数は特定のオブジェクトに格納されていますか?例えば:

var test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);

これらの3つのテストはすべて結果になりundefinedますが、これらの変数を保持するオブジェクトはありますか?

これは私がすでに知っておくべき愚かなことのように感じますが、私はオンラインで答えを見つけることさえできないようです。

4

4 に答える 4

22

これは遅いですが技術的な答えです。

あなたが尋ねる

グローバル変数は特定のオブジェクトに格納されていますか?

答えはイエスです。それらは、正式にはグローバルオブジェクトと呼ばれるものに格納されます。このオブジェクトは、公式のECMAScript5仕様のセクション15.1で説明されています。

グローバルオブジェクトに名前を付ける必要はありません。Stringただし、、などのプロパティは、名前を使用するだけで参照できisNaNますDate。JavaScriptホスト環境では、ECMAScript仕様で必要なプロパティ以外に、alertまたはなどの他のプロパティがグローバルオブジェクトに配置されconsoleます。ブラウザでスクリプトを書くことができます

alert("Hello world");

alertはグローバルオブジェクトのプロパティだからです。

信じられないかもしれませんが、このグローバルオブジェクトにアクセスする方法はまったく必要ないことに注意してください。ただし、すばらしい点は、多くのホスト環境が、グローバルオブジェクト自体への参照値を持つプロパティをグローバルオブジェクトに配置することです。ほとんどのWebブラウザでは、このプロパティはと呼ばれwindowます。したがって、次のように書くことができます。

alert("Hello");
window.alert("Hello");
window.window.alert("Hello");
window.window.window.window.window.alert("Hello");

そしてあなたはまた言うことができます:

var x = 5;
alert(this.x);

アラートを受け取り5ます。

于 2012-07-20T04:52:01.490 に答える
19

ほとんどのブラウザで見つかると思いますが、それらはに保存されていwindowます。

非常にフェッチされた精神的なデバッグの試み:これをjsFiddleでテストしましたか?それともFirebugで?その場合、コードはフレーム内で実行されるため、おそらくundefined3つすべてが表示されます。したがって、別のwindowオブジェクトがあります(私は思う)コードは実際にラップされています:

window.addEvent('load', function() {
  var test="stuff";
  console.log(window.test);
  console.log(document.test);
  console.log(this.test);
});

上記のjsFiddleのスニペットから、グローバル変数でtestないことがわかります。これは、にアタッチされていない理由を説明していますwindow

私は専門家ではありませんが、この答えはChrome、Firefox、Safari、Operaで私が言えることから正確であるように見えます。確認するために、次のコンテンツを含むHTMLファイルを作成し、各ブラウザにロードしました。

<script type="text/javascript">
  var test = "stuff";
  alert(window.test);
</script>

案の定、毎回「もの」。

于 2012-07-20T04:40:47.923 に答える
5

「true」グローバル変数には「var」キーワードがありません。これを試して:

test="stuff";
console.log(window.test);
console.log(document.test);
console.log(this.test);

これにより、すべてのスコープがそれを認識します。varキーワードを持つ変数は、宣言されたスコープに対してローカルです。

変数は、Danが言ったようにウィンドウスコープで宣言した場合にのみ、「グローバルからウィンドウ」(ウィンドウオブジェクトのプロパティ)になり、通常ウィンドウをグローバルスコープとして使用するブラウザに対してグローバルになります。

于 2012-07-20T04:44:09.763 に答える
2

グローバル変数はグローバル変数に格納されwindowます。次のコードは、関数などの外部で宣言するだけで機能します。

var test="stuff";
console.log(window.test);

同様の証拠はそれwindow.location.hrefがと同じであるということですlocation.href

ただし、問題は変数が宣言された場所にある可能性があります。たとえば、この変数を関数で宣言した場合、この変数は関数にのみ存在し、グローバルには存在しません。

function foo(){

    //declaring inside function
    var test="stuff";

    //undefined, since the variable exists in the function only
    console.log(window.test);  

    //undefined, document refers to the document
    //which is the top DOM object, not the global window
    console.log(document.test); 

    //depends on what "this" refers to, especially 
    //when using call() or apply() to call the function
    //For normal function calls, usually it points to window as well
    console.log(this.test);  

    //none of the above refer to "test" that contains "stuff"
    //because you are looking in the wrong place   

}
于 2012-07-20T04:46:55.750 に答える