使用javascript中的setInterval函数在控制台中打印未定义的原型

使用javascript中的setInterval函数在控制台中打印未定义的原型,javascript,Javascript,我试图使用setInterval在原型函数中打印一些东西,它在控制台中显示为未定义 函数newFunc(){ this.name=“这是人名”; 此项。年龄=“16岁”; } newFunc.prototype.init=函数(){ setInterval(function(){newFunc.prototype.xyz()},1000); } newFunc.prototype.xyz=函数(){ console.log(this.Age); } var abc=newFunc(); abc

我试图使用setInterval在原型函数中打印一些东西,它在控制台中显示为未定义

函数newFunc(){
this.name=“这是人名”;
此项。年龄=“16岁”;
}
newFunc.prototype.init=函数(){
setInterval(function(){newFunc.prototype.xyz()},1000);
}
newFunc.prototype.xyz=函数(){
console.log(this.Age);
}
var abc=newFunc();
abc.init()
更改为
this.xyz()
,因为您在同一个
实例中。它在
setInterval
中不起作用,因为
在此处丢失。您需要有此
的引用

newFunc.prototype.init = function(){           
  var that = this;
  setInterval(function(){that.xyz()}, 1000);           
}
正在工作的小提琴


它也在函数内部。因此使用
this.xyz()应用
this
使用一些变量声明并应用到
设置间隔(copy.xyz())

为什么要使用此

this.xyz()
仅适用于
newFunc.prototype.init
。不适用于ah
setInteval(function(){})
。这两个函数是分开的。我们需要一个变量,所以只有我用
var copy

函数newFunc(){
this.name=“这是人名”;
此项。年龄=“16岁”;
}
newFunc.prototype.init=函数(){
var copy=this;//在'this'中,仅适用于newFunc.prototype.init.it从另一个变量复制
此函数中的setInterval(函数(){//不同。
copy.xyz()//传递变量并执行函数
}, 1000);           
}
newFunc.prototype.xyz=函数(){
console.log(this.Age);
}
var abc=newFunc();

abc.init()
但是我如何在init()中设置间隔呢@Mohsin:看看我更新的答案…你的意思是,
var that=this
:)@Keith:那只是一个参考…)不,我知道你的意思是=这个,但不,我想用setInterval在相同的function@Mohsin查看我的更新答案
你能告诉我为什么这不直接起作用吗
匿名函数
function(){}
没有绑定到任何东西,因此它的
将等于
窗口
对象。只有附加到对象或对象原型的函数才会具有有意义的
this
@Mohsin.1
newFunc.prototype.init
newFunc.prototype.xyz
都在同一个函数中。因此需要使用
newFunc.prototype.xyz
调用。这就是为什么使用
应用的原因。2.为什么要应用
copy=this
。因为
newFunc.prototype.xyz
函数和setInterval函数都是不同的函数。但是
this
只适用于
newFunc.prototype.init
所以要用setInterval函数传递。我们需要一个变量。所以只有我用
var copy
声明ok基思:这是怎么回事,它是怎么工作的,。嗯,代码> < /C> >成为所谓的引用,在C++等其他语言中,传递引用的“类似”是获得一般保护错误的可靠方法,但在JavaScript中,它是被完成的事情。因此,
that=this
正在做的是捕获对
this
的引用,并且由于匿名函数在同一范围内,它也可以访问
this
,如下所示:它可以通过
this
的引用访问
this
。因为您在
newFunc.prototype
上下文中调用
xyz
,这将成为您的
。另外,
setInterval
回调有自己的上下文,您还没有绑定它。有关如何设置此
的完整解释,请参见参考问答。您能告诉我如何与回调上下文绑定阅读参考答案中的“除非绑定上下文”一段。你应该试着从阅读中了解自己,但好吧,这就是。。。。您需要:
setInterval(function(){this.xyz()}.bind(this),1000),或更短:
setInterval(this.xyz.bind(this),1000)
newFunc.prototype.init = function(){           
  var that = this;
  setInterval(function(){that.xyz()}, 1000);           
}