Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/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_This - Fatal编程技术网

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
)。详情如下:

对于您引用的代码,您有两个选项:

  • 正如Kolink所评论的,由于您的对象是一个单例对象,并且
    init
    函数关闭在
    talkAPI
    变量上,因此没有任何理由不能只使用
    talkAPI

    var talkAPI = {
        init: function(){
            setInterval(function(){
                talkAPI.speak();    // <=== Only change is here
            },1000);
        },
        speak: function(){
             //Something else
        }
    };
    

  • 在这两种情况下,函数都与它们所关闭的符号有着持久的、生动的联系,这就是为什么它们可以使用它们。以这种方式将数据绑定到函数的函数称为闭包。更多信息:

    问题在于,在JavaScript中,
    这个
    完全由函数的调用方式来定义,而不是定义在什么地方(就像其他语言中使用该关键字一样)。因此,
    setInterval
    调用您赋予它的函数的方式,
    this
    没有设置为任何特定的对象(因此默认为全局对象,在浏览器上是
    window
    )。详情如下:

    对于您引用的代码,您有两个选项:

  • 正如Kolink所评论的,由于您的对象是一个单例对象,并且
    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
    函数可能被多个对象共享的情况下,它也适用于单例,所以这是我们大多数人可能会使用的方法,用于将来的验证,并且只是因为习惯用法很熟悉。