Javascript 为什么window.setTimeout在IE9中引发异常?

Javascript 为什么window.setTimeout在IE9中引发异常?,javascript,internet-explorer-9,settimeout,Javascript,Internet Explorer 9,Settimeout,这是我的密码: save: function(){ window.setTimeout(recipeControlsViewModel.saveWOTimeOut(),500); }, 这是我在IE9中只有在Internet选项中选中“显示关于每个脚本错误的通知”选项时,才会在IE9中遇到的错误。这在FireFox、Chrome或IE10&IE11中不会发生 SCRIPT87: Invalid argument 有人知道为什么会发生这种情况以及如何修复吗?您只需要将该函数调用包装到一

这是我的密码:

save: function(){
    window.setTimeout(recipeControlsViewModel.saveWOTimeOut(),500);
},
这是我在IE9中只有在Internet选项中选中“显示关于每个脚本错误的通知”选项时,才会在IE9中遇到的错误。这在FireFox、Chrome或IE10&IE11中不会发生

SCRIPT87: Invalid argument

有人知道为什么会发生这种情况以及如何修复吗?

您只需要将该函数调用包装到一个匿名函数中:

save: function(){
    window.setTimeout(function() { recipeControlsViewModel.saveWOTimeOut() },500);
},
或者,从IE9开始,您可以使用
.bind()


虽然在这种情况下,这是更多的打字。
.bind()
函数返回另一个与传递给它的对象“绑定”的函数。这意味着返回的函数将使用参数(“recipeControlsViewModel”)调用原始函数(由“saveWOTimeOut”属性引用的函数)作为
this

的值,您正在调用函数并传递其返回值,而不是将函数本身传递给
setTimeout
。如何将函数本身传递给setTimeout?最直接的答案是从末尾删除
()
。这就是它的原因。但这可能会引起另一个问题。被调用的方法可能(而且可能确实)依赖于从中调用它的对象。在这种情况下,您将传递一个匿名函数,该函数从对象调用该方法@Pointy显示了below.or simpler OP如何删除()我刚刚尝试了第一个解决方案,它成功了。这些解决方案中哪一个更稳定,在大多数浏览器中最常用?@epascarello是的,假设函数不期望
这个
是任何东西。@goe第一个很简单,可以在任何地方使用。bind的解释很好。
save: function(){
    window.setTimeout(recipeControlsViewModel.saveWOTimeOut.bind(recipeControlsViewModel) },500);
},