2013-04-05 4 views
6

JavaScript this参照状況で混乱します。JavaScriptこれは関数内のオブジェクトではなくウィンドウを指します

私はオブジェクトメソッド内で関数を宣言するコードを作成しています。 (その理由は、オブジェクトメソッド内でコードを整理して、そのメソッドをその関数にプライベートに保つことです)。

以下は私の問題を再現するための実験です。

私はthisgreeting内部の機能ではなく、範囲の範囲を参照することがわかりました。

var person = { 
    nickname: "Makzan", 
    sayHi: function() { 
     console.log(this); 
     var greeting = function() { 
      console.log(this); 
      return "Aloha " + this.nickname; 
     } 
     console.log(greeting()); 
    } 
} 
person.sayHi(); 

(jsfiddleで同じコード:http://jsfiddle.net/makzan/z5Zmm/

そして、これはブラウザでログ結果である:JSで

> Object 
> Window 
Aloha undefined 

、私はこのリファレンスはトリッキーであることを知っています。そして、私はこのコードを動作させるために.callメソッドを使用して範囲を変更することができます。

var greeting = (function() { 
    console.log(this); 
    return "Aloha " + this.nickname; 
}).call(this); 

はしかし、私は、デフォルトではthis方法を挨拶ウィンドウ範囲を参照してください理由を知りたいのですか?

ご協力いただきありがとうございます。

+1

呼ばれた方法によって 決定されます文脈なしで。 –

+0

ありがとうございます。私は「文脈」が今何を意味するのかについてもっと学ぶ。 – Makzan

答えて

6

thisスコープとは何の関係もありませんあなたのケースでのvar挨拶を指します。 コンテキストによって決定されます。

greeting()はコンテキストを持たない関数を呼び出すため、thisがデフォルトオブジェクト(ブラウザではwindow)です。

2

のTry person.nickname、これは

4

thisの参照はスコープに関連していないため、呼び出しコンテキストによって異なります。一般に

MDN doc 1として

、現在のスコープ内で、これにバインドされたオブジェクトはgreeting`が呼び出される `ので、それがある現在の関数を

関連する問題