Javascript 参考;这";自定义变量
我正在制作这样的东西:Javascript 参考;这";自定义变量,javascript,this,Javascript,This,我正在制作这样的东西: var talkAPI = { init: function(){ setInterval(function(){ this.speak(); },1000); }, speak: function(){ //Something else } }; 然而,我发现这并不像我预期的那样有效。所以我做了一些测试,我发现setInterval中的这个是指窗口。这不是我想要的
var talkAPI = {
init: function(){
setInterval(function(){
this.speak();
},1000);
},
speak: function(){
//Something else
}
};
然而,我发现这并不像我预期的那样有效。所以我做了一些测试,我发现setInterval
中的这个
是指窗口
。这不是我想要的。那么,我如何才能将这个
重新引用到talkAPI
?因为我不想这样做:
setInterval(function(){
window.talkAPI.speak(); //Not so good
},1000);
您需要保存原始的
此
,以便在回调中使用
init: function() {
var self = this;
setInterval(function(){
self.speak();
},1000);
},
您需要保存原始的
此
,以便在回调中使用
init: function() {
var self = this;
setInterval(function(){
self.speak();
},1000);
},
问题在于,在JavaScript中,
这个
完全是由函数的调用方式定义的,而不是定义它的位置(就像在其他语言中使用该关键字一样)。因此,setInterval
调用您赋予它的函数的方式,this
没有设置为任何特定的对象(因此默认为全局对象,在浏览器上是window
)。详情如下:
对于您引用的代码,您有两个选项:
init
函数关闭在talkAPI
变量上,因此没有任何理由不能只使用talkAPI
:
var talkAPI = {
init: function(){
setInterval(function(){
talkAPI.speak(); // <=== Only change is here
},1000);
},
speak: function(){
//Something else
}
};
在这两种情况下,函数都与它们所关闭的符号有着持久的、生动的联系,这就是为什么它们可以使用它们。以这种方式将数据绑定到函数的函数称为闭包。更多信息:问题在于,在JavaScript中,
这个
完全由函数的调用方式来定义,而不是定义在什么地方(就像其他语言中使用该关键字一样)。因此,setInterval
调用您赋予它的函数的方式,this
没有设置为任何特定的对象(因此默认为全局对象,在浏览器上是window
)。详情如下:
对于您引用的代码,您有两个选项:
init
函数关闭在talkAPI
变量上,因此没有任何理由不能只使用talkAPI
:
var talkAPI = {
init: function(){
setInterval(function(){
talkAPI.speak(); // <=== Only change is here
},1000);
},
speak: function(){
//Something else
}
};
在这两种情况下,函数都与它们所关闭的符号有着持久的、生动的联系,这就是为什么它们可以使用它们。以这种方式将数据绑定到函数的函数称为闭包。更多信息:为什么不直接使用
talk.speak()
?与this.speak()长度相同,更可靠;)@Kolink-它取决于对象being@T.J.Crowder我们发布时,它是talk
,经过编辑:p@T.J.Crowder我修好了。(在我的问题中)@T.J.Crowder-Woot,没有看到那个。为什么不直接使用talk.speak()
?与this.speak()长度相同,更可靠;)@Kolink-它取决于对象being@T.J.Crowder我们发布时,它是talk
,经过编辑:p@T.J.Crowder我修好了。(在我的问题中)@T.J.Crowder-Woot,没有看到这个。事实上,这是一个简单易行的方法。还值得一提的是新的ES5功能。有些理论是好的,比如:;-)(免责声明:链接到我的博客。但它没有广告。)是的,这可能是最简单的方法。谢谢。@Derek:实际上,在这个特定的例子中,最简单的方法是Kolink在评论中提到的方法,因为在这个特定的例子中,您处理的是一个单例对象。但是Jared的答案是你通常使用的方法,在init
函数可能被多个对象共享的情况下,它也适用于单例,因此这是我们大多数人可能会使用的方法,用于将来的验证,并且只是因为习惯用法很熟悉。事实上,这是一种简单易行的方法。还值得一提的是新的ES5功能。有些理论是好的,比如:;-)(免责声明:链接到我的博客。但它没有广告。)是的,这可能是最简单的方法。谢谢。@Derek:实际上,在这个特定的例子中,最简单的方法是Kolink在评论中提到的方法,因为在这个特定的例子中,您处理的是一个单例对象。但是Jared的答案是你通常使用的方法,在init
函数可能被多个对象共享的情况下,它也适用于单例,所以这是我们大多数人可能会使用的方法,用于将来的验证,并且只是因为习惯用法很熟悉。