Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在函数内部调用函数时绑定此函数_Javascript - Fatal编程技术网

Javascript 在函数内部调用函数时绑定此函数

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

在阅读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();

为什么函数
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