1

ステートメント:

for( var item in this){
    console.log( item );
}

グローバルな文脈でのヌープです。ただし、関数では

function foo(){
    for( var item in this){
        console.log( item );
    }
}
foo();

これにより、グローバル環境オブジェクトが生成されます。この動作の理由は何ですか?

最初のサンプルのように、現在スコープ内にあるオブジェクトにアクセスするための構文は何ですか?

4

4 に答える 4

2

JavaScript では、「this」は現在のオブジェクトではなく、現在のメソッドの実行中のコンテキストです。

例えば ​​:

function foo(){ 
   console.log(this);
}

グローバル コンテキストでは:

  • foo()を呼び出すと、コンソール ロググローバル
  • setTimeout(foo, 0)を呼び出すと、foo がタイマーによって呼び出されるため、コンソールは Timer オブジェクトをログに記録します。

メソッドを呼び出す最良の方法は、Function オブジェクトの call メソッドを使用して、メソッドを呼び出すときに実行中のコンテキストを自分自身にバインドすることです。

foo.call(this);

私の悪い英語でごめんなさい。^-^

于 2012-11-14T11:53:32.103 に答える
1

ECMA-262 §10.4.1.1は、グローバル実行コンテキストに入るthisと、グローバル オブジェクトに設定されることを示しています。したがって、最初のコード例がグローバル コンテキストで実行される場合はthis、グローバル オブジェクトを参照する必要があります。

は持っていませんがnode.js、それがホスト環境である場合はnode.js、質問にタグを追加して、 について知っている人を引き付ける必要がありnode.jsます。

2 番目の例では、関数thisは呼び出しによって設定されないため、デフォルトでグローバル オブジェクトになります。厳密モードでは未定義になり、アクセスしようとするthisとエラーがスローされます。

于 2012-11-14T00:15:01.317 に答える
1

MDN のキーワードの紹介をご覧thisください。

グローバル スコープでthisは、グローバル オブジェクトを参照します。

厳密モード(有効にしていないようです)では、単純な関数呼び出しでundefinedthis-value が発生します。

非厳密な関数 (あなたのようなfoo) の場合、単純な呼び出しthisで再びグローバル オブジェクトになります。

于 2012-11-14T00:05:06.257 に答える
1

thisおそらくノードのエクスポート オブジェクトを指しています。

したがって、最初のケースでは、オブジェクトthisを指さないのは正しいことです。window2 番目のケースでは、thisは関数 (オブジェクトのメソッドではない) の内部にあるため、ご想像のとおり、window.

于 2012-11-14T00:10:37.160 に答える