1

最初にコードを見てみましょう

var name = "The Window"; 
var object = { 
  name : "My Object", 
  getNameFunc : function(){ 
    return function(){ 
      return this.name; 
    }; 
   } 
}; 

alert(object.getNameFunc()());

結果は"The Window"; すべてのステップで何が起こったのか知りたいです。thisこの関数を呼び出すオブジェクトを指していると思います。右?しかし、なぜこの場合thiswindow

4

2 に答える 2

1

2番目の関数の呼び出しは、オブジェクトのコンテキストからではなく、最初の呼び出しから返された関数から行われます。

オブジェクトコンテキストがないため、他の関数と同じようにthis値がデフォルトになります。window

 //   v-----------------v------function has context
alert(object.getNameFunc()());
            // -----------^----second function was returned from the first
            //                   and invoked so there's no object context

代わりに、返された関数をに割り当て、objectそのコンテキストから呼び出した場合、thisはへの参照になりobjectます。

obj.foo = object.getNameFunc();
obj.foo();  // "My Object"

まったく同じ関数ですが、現在はのプロパティとして呼び出されており、object暗黙的にそのthis値を。に設定しますobject


のルールはthis非常にシンプルで理解しやすいですが、最初は期待したものではないかもしれません。

値は非常に動的であり、関数の呼び出し方法this完全に基づいています。

foo();            // 'this' is 'window'

object.foo();     // 'this' is 'object'

foo.call(object); // 'this' is 'object'
foo.apply(object);// 'this' is 'object'

var bar = foo.bind(object);
bar();            // 'this' is 'object'

windowしたがって、デフォルトは、別のオブジェクトへの接続なしで関数が呼び出された場合であることがわかります。

しかし、関数をオブジェクトのプロパティとして呼び出すと、this突然そのオブジェクトを参照します。

.callまたは、、.applyまたはを使用して、関数呼び出し.bindの値を手動で設定できます。this

于 2012-10-17T04:03:39.010 に答える
1

新しいクロージャーなので、の意味thisが失われます。this常に対処するのが難しいので、var that = thisクロージャ内で意味が失われないようにするために、常にそのような関数を開始することを好みます。

于 2012-10-17T04:04:36.343 に答える