2

プロトタイプ関数の下にネストされた関数は、プロトタイプ用に定義された this.variables を取得しません。

var Person, p;

Person = function(name, age) {
  this.name = name;
  this.age = age;
};

Person.prototype.getInfo = function() {
  var innerFun;
  innerFun = function() {
    return this.name;
  };
  return "name: " + (innerFun()) + " age: " + this.age;
};

p = new Person('dork', 99);

console.log(p.getInfo());      // name:  age: 99

すべての関数はオブジェクトであるため、これはすべての関数定義内で異なると思いました。しかし、次のコードはそのロジックを吹き飛ばします。

var getInfo;

getInfo = function() {
  var display;
  this.name = 'dork';
  return display = function() {
    return this.name;
  };
};

console.log(getInfo()());     // dork

この動作の背後にあるロジックはありますか、それとも原則としてこの問題を回避するために call() を使用する必要がありますか?

4

2 に答える 2

1

短いバージョンのthis動作:

  1. として呼び出される関数ではx.f()、 にthisなりますx
    (注:として呼び出さx.f()ます。どこでどのように定義してもかまいません)
  2. として呼び出される関数ではf()、 にthisなりますwindow
  3. として呼び出される関数ではx['f']()、にthisなります(なぜそうでないと思ったのかわかりません)window x
  4. f.call(x)またはとして呼び出される関数ではf.apply(x)thisになりますx

繰り返しますが、プロトタイプは問題ではありません。

var f = p.getInfo;
console.log(f());

呼び出しスタイルだけが重要であることがわかります。

于 2012-12-24T04:01:42.580 に答える
0

結論の要約:

規則: 関数呼び出しにコンテキストが使用されない場合、デフォルトのコンテキストはグローバル ウィンドウ オブジェクトです。

this.name = 'global';
console.log(p.getInfo());       // name: global age: 99

solution1
使用呼び出し/適用

return "name: " + (innerFun.call(this)) + ": Age " + this.age;

solution2 これを内部関数に
使用します

this.innerFun = function() {
  return this.name;
};
return "name: " + (this.innerFun()) + ": Age " + this.age;

ソリューション3

self = this
innerFun = function() {
  return self.name;
};
于 2012-12-24T14:10:43.803 に答える