javascript - 嵌套在原型(prototype)函数下的函数表现不同

标签 javascript

嵌套在原型(prototype)函数下的函数不会获得为原型(prototype)定义的 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

我认为既然每个函数都是一个对象,this 在每个函数定义中都会不同;但是下面的代码打破了这个逻辑。

var getInfo;

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

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

此行为背后是否存在逻辑,或者我应该将其作为规则并使用 call() 来解决此问题?

最佳答案

这个行为的简短版本:

  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

同样,原型(prototype)并不重要,如果你这样做的话

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

您会发现只有调用风格很重要。

关于javascript - 嵌套在原型(prototype)函数下的函数表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14016841/

相关文章:

javascript - 如何重写 WebSocket send() 方法

javascript - 将货币值(value)格式化为英镑和便士

javascript - 使用 Animsition 和 Infinite Scroll js

javascript - 如何将 Canvas 转换为图像?

javascript - Stack Overflow 信誉图 (Flot) 的文档

javascript - 如何在没有突变的情况下使用 javascript Map

javascript - 使用 "jquery-latest.min.js"是不好的做法吗?

javascript - 与 Webpack 的 resolve.root 选项同构 React

javascript - 当按钮和功能位于单独的文件中时,如何在 react.js 中创建弹出窗口?

javascript - jQuery cookie 插件 : Setting a cookie for a year and after closing browser and re-opening - the cookie is gone