Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.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 为什么“this”与我的对象失去了联系?_Javascript_Recursion_This_Javascript Objects - Fatal编程技术网

Javascript 为什么“this”与我的对象失去了联系?

Javascript 为什么“this”与我的对象失去了联系?,javascript,recursion,this,javascript-objects,Javascript,Recursion,This,Javascript Objects,我试图创建一个递归方法,但它正在失去与this的绑定。以下是重新创建我的问题的最简单方法: var Foo = function() { return { foo : 'foo', bar : function() { co​nsole.log(this.foo); setTimeout(this.bar, 500); } }​; } var foo = new Foo(); foo.

我试图创建一个递归方法,但它正在失去与
this
的绑定。以下是重新创建我的问题的最简单方法:

var Foo = function() {
    return {
        foo : 'foo',
        bar : function() {
            co​nsole.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() {
            co​nsole.log(this.foo);
            setTimeout(this.bar(), 500); //Add '()'
        }
    }​;
}
var foo = new Foo();
foo.bar();​
这项工作:

var Foo = function() {
    return {
        foo : 'foo',
        bar : function() {
            co​nsole.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中不是必需的,但它也没有害处。我忽略括号是错误的(想想尼克的答案)