1

_.bind と _bindAll を理解できるように、でチュートリアルを読んでいます

ウェブサイトには次のコードがあります

function Developer(skill) {
  this.skill = skill;
  this.says = function(){
    alert(this.skill + ' rocks!');
  }
}
var john = new Developer('Ruby');
john.says(); //Ruby rocks!

function Developer(skill) {
  this.skill = skill;
  this.says = function(){
    alert(this.skill + ' rocks!');
  }
}
var john = new Developer('Ruby');
var func = john.says;
func();// undefined rocks!

関数への参照を保存してから関数を呼び出すと、ウィンドウのコンテキストが発生するのはなぜですか?

4

2 に答える 2

2

「this」キーワードは、定義時ではなく呼び出し時にバインドされるためです。

あなたが呼び出すとき、john.says()それはやっているようなものjohn.says.apply(john)です。

あなたが呼び出すとき、func()それはやっているようなものfunc.apply()です。

Yehuda Katz は、「 JavaScript 関数の呼び出しとthis」について素晴らしい説明をしています。

于 2013-02-14T16:17:14.027 に答える
2

実行すると

a.b();

thenがバインドされた関数でない限り、 ( inside )aの実行コンテキストです。bthisbb

あなたが持っていない場合a、それはあなたが持っている場合です

b();

それなら同じです

window.b();

windowの実行コンテキストも同様ですb

また、

a.b();

と同じです

b.call(a);

b();

と同じです

b.call(); // call replaces its first argument by the global object if it's null or undefined

コンテキストをバインドしたい場合は、(最新のブラウザで)行うことができます

var func = john.says.bind(john);
func();

または(より古典的に)クロージャーを使用します:

var func = function(){john.says()};
func();
于 2013-02-14T16:09:45.830 に答える