使用javascript中的setInterval函数在控制台中打印未定义的原型
我试图使用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
函数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
。不适用于ahsetInteval(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.1newFunc.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);
}