假设我有一组看起来像这样的js:
function a() {
this.meow = 0;
var go = setTimeout(function() {
this.parent.meow++;
}, 500);
}
var woof = new a();
Run Code Online (Sandbox Code Playgroud)
为什么不woof.meow增加,如果我引用它错了那么为什么这样做:
(function() {
this.meow = 'woof';
var go = setTimeout(function() {
alert(this.parent.meow);
},500);
return true;
})();
Run Code Online (Sandbox Code Playgroud)
甚至更令人困惑的是,为什么这不起作用:
(function() {
this.meow = 0;
var go = setTimeout(function() {
alert(this.parent.meow++);
},500);
return true;
})();
Run Code Online (Sandbox Code Playgroud)
parent在JavaScript中没有特殊含义(尽管它在浏览器上有用).在你的超时函数中,this不引用你的a实例,它指的是window对象.碰巧该window对象具有一个名为的属性parent,但该父级可能没有一个名为的属性meow.原因this在于window你的超时函数是在JavaScript中,this完全由函数的调用方式定义,而不是定义它们的位置.见下面的链接.
由于您的超时函数是对调用上下文的闭包new a,您可以这样做:
function a() {
var self = this;
this.meow = 0;
var go = setTimeout(function() {
self.meow++;
}, 500);
}
Run Code Online (Sandbox Code Playgroud)
什么是不设置一个叫做变量self,它的值this调用内a.超时功能关闭self,因此可以使用self.meow.
如果我引用它错了那么为什么这样做
你引用的代码不工作(活生生的例子),但我怀疑你看到类似的东西给它的代码,因为工作,this引用window的对象,这是很容易落得调用一个函数,使得this引用window.因此,meowwold最终成为一个全局变量(你输入的所有属性window都是全局变量).
更多关于闭包和this(在我的博客上):
| 归档时间: |
|
| 查看次数: |
1452 次 |
| 最近记录: |