Javascript 为什么“this”与我的对象失去了联系?
我试图创建一个递归方法,但它正在失去与Javascript 为什么“this”与我的对象失去了联系?,javascript,recursion,this,javascript-objects,Javascript,Recursion,This,Javascript Objects,我试图创建一个递归方法,但它正在失去与this的绑定。以下是重新创建我的问题的最简单方法: var Foo = function() { return { foo : 'foo', bar : function() { console.log(this.foo); setTimeout(this.bar, 500); } }; } var foo = new Foo(); foo.
this
的绑定。以下是重新创建我的问题的最简单方法:
var Foo = function() {
return {
foo : 'foo',
bar : function() {
console.log(this.foo);
setTimeout(this.bar, 500);
}
};
}
var foo = new Foo();
foo.bar();
这只会运行两次。第一次它将记录foo
到控制台,第二次它将记录undefined
。当然,它将不再运行,因为bar
不再是this
的属性,因为我假设它已重置为全局对象
我在bar
方法中尝试了var that=this
,并引用了that.foo
和that.bar
,但它没有改变任何东西。我还在我的return
语句上方尝试了var=this
,问题仍然存在
预期结果:
福
福
福
福
。。。等等
以下是一个导致以下情况的示例:
福
未定义
setTimeout
将在当前范围内调用其函数,但将此
作为全局对象
解决这一问题的最佳方法是:
var that = this;
setTimeout(function() {that.bar.apply(that);},500);
setTimeout
将在当前范围内调用其函数,但将此
作为全局对象
解决这一问题的最佳方法是:
var that = this;
setTimeout(function() {that.bar.apply(that);},500);
这项工作:
var Foo = function() {
return {
foo : 'foo',
bar : function() {
console.log(this.foo);
setTimeout(this.bar(), 500); //Add '()'
}
};
}
var foo = new Foo();
foo.bar();
这项工作:
var Foo = function() {
return {
foo : 'foo',
bar : function() {
console.log(this.foo);
setTimeout(this.bar(), 500); //Add '()'
}
};
}
var foo = new Foo();
foo.bar();
这也会起作用
这也会起到作用。因为
这个
在函数范围内被覆盖。我们应该为这个=This
,self=This
这个似乎每天都困扰javascript开发人员的难题命名。从代码的外观来看,我推断您正在学习模块模式。太棒了,但如果你不介意我太迂腐的话:在这种情况下,原型方法可能更合适,因为现在你正在为每个新实例创建一个新的函数对象。。。所有bar
属性都是独立的对象,它们执行完全相同的操作。这并不理想。如果你不想增加proptotype,闭包当然也可以。你可以使用模块模式为我发布一堆上述代码吗?因为此
在函数范围内被重写。我们应该为此
命名,self=这个
难题似乎每天都困扰着javascript开发人员。从您的代码外观来看,我推断您正在学习模块模式。太棒了,但如果你不介意我太迂腐的话:在这种情况下,原型方法可能更合适,因为现在你正在为每个新实例创建一个新的函数对象。。。所有bar
属性都是独立的对象,它们执行完全相同的操作。这并不理想。如果您不想增加proptotype,闭包当然也可以。您可以使用模块模式为我发布上面的代码吗?它可能会很好地工作,但它不会做同样的事情:这会在半秒钟后调用方法的返回值,而不是方法本身。你刚刚创建了一个无限循环!它可能会很好地工作,但它不会做同样的事情:这会在半秒钟后调用方法的返回值,而不是方法本身。你刚刚创建了一个无限循环@Alexander内部的匿名函数此
范围已更改谢谢!前几天我读到了关于call and apply的文章,一定是太激动了,记不起来了。@Ibu,Elias Van Ootegem,你最好再读一遍。《匿名》里没有逻辑function@ibu:这无关紧要:That.bar()
调用函数对象,在That
的上下文中由bar
引用,该在匿名函数中引用的任何都是无关的。如果它真的很重要,那么全局范围中的someObject.bar()
意味着这个也会指向这里的全局对象(它不是)@Alexander:当然有。。。应用程序在IMO中不是必需的,但它也没有害处。我错了,省略了括号(想想尼克的答案)@Alexander在匿名函数中这个范围已经改变了谢谢!前几天我读到了关于call and apply的文章,一定是太激动了,记不起来了。@Ibu,Elias Van Ootegem,你最好再读一遍。《匿名》里没有逻辑function@ibu:这无关紧要:That.bar()
调用函数对象,在That
的上下文中由bar
引用,该在匿名函数中引用的任何都是无关的。如果它真的很重要,那么全局范围中的someObject.bar()
意味着这个也会指向这里的全局对象(它不是)@Alexander:当然有。。。应用程序在IMO中不是必需的,但它也没有害处。我忽略括号是错误的(想想尼克的答案)