2012-03-22 6 views
2

トップレベルの関数はwindowオブジェクトのメンバーであり、その内部のthiswindowを参照しています。トップレベルでない関数は、どのオブジェクトのメンバーですか?

しかし、トップレベルでない関数の場合、thisはまだwindowですが、windowのメンバーではありません!ここで

は、いくつかのコードです:

function topLevel1() { 
    alert(this) 
} 

function topLevel2() { 
    function inner() { 
     alert(this) 
    } 

    inner() 
} 

topLevel1()    // alerts DOMWindow 
alert(window.topLevel1) // alerts text of topLevel1, as expected 

topLevel2()     // again, alerts DOMWindow 
alert(window.inner)   // undefined 
alert(window.topLevel2.inner) // undefined 
  1. innerは、そのメンバーそれはwindowのもtopLevel2のメンバーで、どちらの場合は?
  2. どうすればthiswindowですが、windowのメンバーではありませんか?
  3. this == ownerの場合は、現在のメソッドがowner.で呼び出されたことはJavascriptの法則ではありませんか?このキーワードの素晴らしい基準である

答えて

2

また、関数の値は、how関数が呼び出された場所ではなく、その場所がどのように設計されているかによって決まります。

あなたはどこでもあなたのコード内

foobar() 

関数を呼び出す場合は、ちょうどそのよう、そのthis値は常にwindow(非strictモード)またはundefined(厳密)になります。今度は.apply().call()、または.bind()で関数を呼び出すのと同じように、を変更する方法がたくさんあります。これらのメソッドはすべて、指定された関数の値をthisに変更する機会を与えます。また、newキーワードを使用して関数を呼び出すと、thisは、新しく作成されたオブジェクト(これも返されます)を参照します。

したがって、関数の位置は、そのコンテキストについて0またはを通知します。

今、あなたの特定の質問に答えるために:

  1. inner

  2. 上述のtopLevel2(ES3)からActivation Objectのメンバーである私も

  3. 上カバーのthatsを推測
+0

よりks、それは今私にとっては明らかです。 – Fixpoint

+0

私は、なぜJSが 'this == obj'で名前付き関数' f'を呼び出すための構文 'obj.f'を許さないのか分かりませんが。 – Fixpoint

+0

それを無視して、 '.'はメンバーアクセスのためだけです。 – Fixpoint

1

(ETCコンストラクタ、applycall、のような特別な場合を除いて):http://www.quirksmode.org/js/this.html

topLevel2内部内()関数は、()のみtopLevel2に視認することができます。スコープの問題です。だからあなたは未定義になる。

関連する問題