在函数内部调用函数时绑定它

时间:2017-05-20 06:58:58

标签: javascript

通过MDN阅读并遇到了这个

function Person() {
  // The Person() constructor defines `this` as an instance of itself.
  this.age = 0;

  setInterval(function growUp() {
    // In non-strict mode, the growUp() function defines `this` 
    // as the global object, which is different from the `this`
    // defined by the Person() constructor.
    this.age++;
  }, 1000);
}

var p = new Person();

为什么函数this中的growUp()绑定到window

2 个答案:

答案 0 :(得分:0)

'这'在setTimeout处理程序中引用窗口对象,因为Person对象的上下文消失了,之后setTimeout回调函数引用了窗口对象。

答案 1 :(得分:0)

因为this没有绑定任何其他内容。 如果它没有绑定,则在调用默认对象时绑定它。默认为全局window对象。

如果您需要将其绑定到人,您可以使用bind函数明确地执行此操作:

function Person() {
   this.age = 0;

  setInterval(function growUp() {
    this.age++;
  }.bind(this), 1000);
}

var p = new Person();

编辑:

在javascript中,您有两种调用函数的方法:

作为功能本身

function f() {}
f();

作为对象的属性

var obj = {
    f: function() {}
};
obj.f();

通过对象原型:

function X() {}
X.protoype.f = function() {}
var x = new X();
x.f()

对于第一种情况,this未定义,需要设置为某种情况。默认情况下,它是全局对象(浏览器中的window对象)。

对于第二个和第三个案例this设置为点之前的对象。'它们只是如何找到函数。