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. 在调用 as 的函数中x.f()this将是x.
    (注意:调用x.f()。无论您如何以及在何处定义它都无关紧要)
  2. 在调用 as 的函数中f()this将是window.
  3. 在调用 as 的函数中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

解决方案1
​​使用呼叫/申请

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

解决方案2 将此
用于内部功能

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 回答