Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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 如何让setTimeout在对象中执行方法?_Javascript_Oop_Settimeout - Fatal编程技术网

Javascript 如何让setTimeout在对象中执行方法?

Javascript 如何让setTimeout在对象中执行方法?,javascript,oop,settimeout,Javascript,Oop,Settimeout,我想有一个下拉菜单关闭后,鼠标事件本身,经过短暂的延迟。但我很难让它工作 考虑对象中的以下方法:(我正在使用jQuery) 这不管用。也就是说,此.message未定义。经过一番挖掘,我明白了原因。:)执行时,setTimeout内的代码无法使用“that”引用 我想知道,解决这类问题的“最佳”方法是什么?如何让一个方法使用setTimeout调用同一对象中的另一个方法,并且仍然可以访问该对象中的属性 提前感谢您的帮助。这里的问题是您正在将closeMenu方法与其对象分离。如果您这样做,您也会

我想有一个下拉菜单关闭后,鼠标事件本身,经过短暂的延迟。但我很难让它工作

考虑对象中的以下方法:(我正在使用jQuery)

这不管用。也就是说,此.message未定义。经过一番挖掘,我明白了原因。:)执行时,setTimeout内的代码无法使用“that”引用

我想知道,解决这类问题的“最佳”方法是什么?如何让一个方法使用setTimeout调用同一对象中的另一个方法,并且仍然可以访问该对象中的属性


提前感谢您的帮助。

这里的问题是您正在将closeMenu方法与其对象分离。如果您这样做,您也会遇到同样的问题:

var closeMenu = myObj.closeMenu;  // detaching the method from the object
closeMenu();
像这样分离和调用方法意味着它们不再应用于创建它们的对象。在您的示例中,您正在做几乎相同的事情:

// Setting the first parameter of setTimeout to be the detached closeMenu method
that.timer = setTimeout(that.closeMenu,500); 
第一种方法的修复方法是使用
调用
应用
方法:

var closeMenu = myObj.closeMenu;  // detaching the method from the object
closeMenu.apply(myObj);
但这对一个定时器来说是行不通的。而是创建一个匿名函数:

that.timer = setTimeout(function () { that.closeMenu(); },500); 

还有一点可能值得一提——不要与jQuery的
$(“#选择器”).bind()
相混淆——这是一种在各种博客和一些库中流行了一段时间的方法(Prototype是最著名的),并最终在中实现


我在自己创建的一两个类中使用了类似的方法,因为它只是让事情变得更简单。

@Nick:问题中有jQuery。是的,对不起,我忘了提到我正在使用jQuery。@Travis:不用担心。我在ECMAScript第5版中添加了更多关于
bind()
方法的内容,在您发布该评论后大约11秒,可能对您有用:-)FWIW:construct
closeMenu=myObj.closeMenu
在Python中工作(是的:稍后调用时,
closeMenu()
调用该对象的方法)。所以我不得不向So咨询如何在JavaScript中实现这一点。
that.timer = setTimeout(function () { that.closeMenu(); },500); 
that.timer = setTimeout(that.closeMenu.bind(that),500);