Javascript 在函数内部调用函数时绑定此函数
在阅读MDN时发现了这个Javascript 在函数内部调用函数时绑定此函数,javascript,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, w
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();
为什么函数
growtup()
中的this
绑定到window
?setTimeout处理程序中的“this”指的是window对象,因为Person对象的上下文消失了,在此之后,setTimeout回调函数引用窗口对象。setTimeout处理程序中的“this”在Person对象的上下文消失时引用窗口对象,在此之后,setTimeout回调函数引用窗口对象。因为此
未绑定到任何其他对象。
如果未绑定,则在调用默认对象时将其绑定。默认值为全局窗口对象
如果需要将其绑定到个人,可以使用bind
函数显式执行:
function Person() {
this.age = 0;
setInterval(function growUp() {
this.age++;
}.bind(this), 1000);
}
var p = new Person();
编辑:
在javascript中,有两种调用函数的方法:
function Person() {
this.age = 0;
setInterval(function growUp() {
this.age++;
}.bind(this), 1000);
}
var p = new Person();
作为功能本身
function f() {}
f();
作为对象的属性
var obj = {
f: function() {}
};
obj.f();
通过对象原型:
function X() {}
X.protoype.f = function() {}
var x = new X();
x.f()
对于第一种情况,未定义此
,需要设置为某个值。默认情况下,它是全局对象(窗口
浏览器中的对象)
对于第二种和第三种情况,将此
设置为点“.”之前的对象,它们仅不同于函数的查找方式。因为此
不与任何其他对象绑定。
如果未绑定,则在调用默认对象时将其绑定。默认值为全局窗口对象
如果需要将其绑定到个人,可以使用bind
函数显式执行:
function Person() {
this.age = 0;
setInterval(function growUp() {
this.age++;
}.bind(this), 1000);
}
var p = new Person();
编辑:
在javascript中,有两种调用函数的方法:
function Person() {
this.age = 0;
setInterval(function growUp() {
this.age++;
}.bind(this), 1000);
}
var p = new Person();
作为功能本身
function f() {}
f();
作为对象的属性
var obj = {
f: function() {}
};
obj.f();
通过对象原型:
function X() {}
X.protoype.f = function() {}
var x = new X();
x.f()
对于第一种情况,未定义此
,需要设置为某个值。默认情况下,它是全局对象(窗口
浏览器中的对象)
对于第二种和第三种情况,将此
设置为点“.”之前的对象,它们仅不同于函数的查找方式。随着Person对象的上下文消失,您能否详细说明一下?Person函数的执行已完成,setTimeout回调函数在此之前没有Person的引用当实际的回调函数被执行时,它开始引用该函数的窗口对象。为了解决这种情况,我们将当前对象即“this”保存在一个变量中,并开始使用variable而不是“this”,因为Person对象的上下文消失了
您能详细说明一下吗?Person函数的执行已完成,setTimeout回调函数直到那时才获得Person的引用。当实际回调函数已执行,并开始引用该函数的窗口对象。为了解决这种情况,我们将当前对象即“this”保存在一个变量中,并开始使用variable而不是“this”,因此无论在哪里调用setInterval,它都将始终绑定到窗口
?当然,不用手动更改上下文。谢谢,但我正试图找到它不与任何其他内容绑定的原因。在我看来,this
亲自调用setInterval
;这显然是错误的。这个人创建了计时器服务调用的函数。为什么创建的函数在默认情况下不绑定到创建函数的同一对象。。。我试着把这句话添加到答案中。我想我现在明白了。setInterval更像是由Person
发起的,然后稍后的窗口调用它?在这一点上,这是指窗口。这或多或少是正确的。这实际上是设置为运算符“”之前的对象。当调用interval函数时,则没有这样的对象,默认情况下,该对象设置为window/global Objects,因此无论在何处调用setInterval,它都将始终绑定到window
?当然,不用手动更改上下文。谢谢,但我正试图找到它不与任何其他内容绑定的原因。在我看来,this
亲自调用setInterval
;这显然是错误的。这个人创建了计时器服务调用的函数。为什么创建的函数在默认情况下不绑定到创建函数的同一对象。。。我试着把这句话添加到答案中。我想我现在明白了。setInterval更像是由Person
发起的,然后稍后的窗口调用它?在这一点上,这是指窗口。这或多或少是正确的。这实际上是设置为运算符“”之前的对象。当调用interval函数时,则没有这样的对象,默认情况下,它设置为window/global object