2012-07-20 11 views
14

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

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

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

これは私がすでに知っているはずの愚かなものだと感じますが、私はオンラインで回答を見つけることさえできません。

+3

簡単な答え:グローバル変数をどのように参照するかは、環境によって異なります。 –

+1

「環境」とは、具体的にはどういう意味ですか?ブラウザ、スコープ、OS? – twiz

+0

JavaScriptはブラウザ、Adobe Photoshop、古いVRMLブラウザ、Javaプログラムや他の多くのホストシステムに組み込むことができるエンジン内で実行できます。これらを「ホスト環境」と呼びます。だから、それはブラウザかもしれない。 JavaScriptプログラムは、これらの環境からオブジェクトを操作します。 –

答えて

15

ほとんどのブラウザには、があります。は、windowに格納されています。

心霊的なデバッグの試み:jsFiddleでこれをテストしましたか?それともFirebugで?もしそうなら、あなたはおそらくundefinedを3つすべて見ることになります。その場合、 というコードがフレーム内で実行されるからです。あなたは testそれはhasn理由を説明するグローバル変数、ではないことをjsFiddleから上のコードから見ることができます

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

:それは違う windowオブジェクト(と思う) コードが実際にラップされていtはwindowに添付されました。

私はエキスパートではありませんが、この回答はChrome、Firefox、Safari、Operaで正確なものと思われます。確認するために、次のコンテンツを含むHTMLファイルを作成し、各ブラウザにロードしました。

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

必ず「stuff」を必ず入力してください。

+0

私は「これは私がすでに知っているはずの愚かなものだ」と思った理由があることを知っていました。あなたはまさに正しい、私はjsFiddleを使っていた...私自身の愚かさの方向に私を指摘してくれてありがとう。 haha – twiz

+3

愚かではないことから、それは良い質問でした。 –

+0

私はRayと一緒です。それは間違いなく良い質問です。実際、この答えは実際には真実だと思うほど奇妙です。 –

5

"true"グローバル変数には "var"キーワードがありません。これを試してみてください :これにより

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

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

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

+1

「本当の」グローバル?グローバルスコープで 'var'を使うと、グローバル変数になります。 – nnnnnn

+0

@nnnnnn二重引用符の使用は意図的でした;) – davidbuzatto

+0

面白いです。私はjsfiddleでこれを試しましたが、代わりに "stuff"、 "undefined"、 "stuff"を得ました。そして、最初と最後は 'this === window'と同じです。 http:// jsfiddle。net/5Xtaq/1/ –

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 

} 
+0

これは 'var'キーワードであり、[@davidbuzatto](http://stackoverflow.com/a/11573012/143295)は良いアイデアを持っていました。 – Nicole

17

は後半が、技術的な答えです。あなたは

を尋ねる

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

答えはyesです。それらは、公式に、というグローバルオブジェクトと呼ばれるものに格納されています。このオブジェクトはofficial ECMAScript 5 Specificationのセクション15.1で説明されています。

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

alert("Hello world"); 

を書くことができます。

このグローバルオブジェクトにアクセスする方法は、必ずしも存在する必要はありません。ただし、多くのホスト環境ではグローバルオブジェクトにプロパティを配置し、その値はで、グローバルオブジェクト自体への参照であるです。ほとんどの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が警告を取得します。

関連する問題