2011-12-28 13 views
0

なぜthisが以下のコードのjsグローバルスコープを指していないのですか?コード例の `this`がjsグローバルスコープを指していない理由

<html> 
<head></head> 
<body> 
<script type="text/javascript"> 

var valueHolder = { 
    value: '', 
    setValue: function(newValue) { 
     this.value = newValue; 
    }, 
    getValue: function() { 
     return this.value; 
    } 
} 

valueHolder.setValue("hello world"); 

alert(valueHolder.getValue()); // return "hello world" 
alert(valueHolder.value);  // return "hello world" 
alert(window.value);   // return "undefined" 

</script> 
</body> 
</html> 
+2

http://stackoverflow.com/questions/3127429/javascript-this-keyword http://www.quirksmode.org/js/this.html –

答えて

2

は(the specの11.2.3 C.F.)関数への参照に依存:

var valueHolder = { 
    value: '', 
    setValue: function(newValue) { 
     this.value = newValue; 
    }, 
    getValue: function() { 
     return this.value; 
    } 
} 

var set = valueHolder.setValue, 
    get = valueHolder.getValue; 

set('test'); 

alert(get());     // return "test" 
alert(valueHolder.value);  // return "" 
alert(window.value);   // return "test" 

コンテキストthis呼ばれる(あなたの例ではvalueHolder)関連するコンテキストに設定されています。上記の例では、関数定義は明確に同一ですが、関数参照はオブジェクトのコンテキストにはありません。この場合、thisはグローバルコンテキスト(window)に設定されます。普遍的真実ではない

2

値はオブジェクト内のキーであり、ウィンドウオブジェクト内では表示されないため、値は未定義を返します。あなたはそれがグローバルスコープになると思いますなぜ

window.valueHolder.value 

(コード内でthisキーワードのValueHolderオブジェクトを参照している、明確にすること)

+0

。 – davin

+0

-1なぜ "[this]は以下のコードでjsグローバルスコープを指していないのですか"という言い方、言い換えれば "[this]キーワードがvalueHolderオブジェクトを参照する理由" – nahab

0

を使用してアクセスしますか?

valueHolder.getValue(); 

は次に関数内でJavaScriptが自動的に対象となる thisを設定します:オブジェクトは、関数を参照する性質を持っており、あなたはこのようにドット表記を使用してその関数を呼び出す

関連する問題