Javascript Firefox中的设置超时问题

Javascript Firefox中的设置超时问题,javascript,firefox,Javascript,Firefox,为什么以下内容在Firefox(v16)中不起作用 我在控制台中得到的错误是:“无用的setTimeout调用(参数周围缺少引号?)。用引号括起来似乎没什么作用,只是让它呈现为字符串(毫不奇怪) 但是,当我将其封装在匿名函数中时,它确实可以正常工作,如下所示: var t = setTimeout(function(){ foo(); }, 1000); 但为什么有必要呢?为什么它不会在Webkit或Opera中爆炸?运气好吗?这是因为您在第一个示例中调用了fo

为什么以下内容在Firefox(v16)中不起作用

我在控制台中得到的错误是:“无用的setTimeout调用(参数周围缺少引号?)。用引号括起来似乎没什么作用,只是让它呈现为字符串(毫不奇怪)

但是,当我将其封装在匿名函数中时,它确实可以正常工作,如下所示:

var t =
    setTimeout(function(){
       foo();
     }, 1000);

但为什么有必要呢?为什么它不会在Webkit或Opera中爆炸?运气好吗?

这是因为您在第一个示例中调用了
foo

这基本上与这样做相同:

var tempResultOfFoo = foo();
var t = setTimeout(tempResultOfFoo, 1000);

将方法传递给
setTimeout()
时,它将在全局范围内执行<代码>此将在执行时指向
窗口
。阅读更多

如果
foo
不是全局的,则不会找到它,因此
ReferenceError

var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval;
// just backed up the defaults. Now basically creating timeout and setInterval
//functions that take scope as a parameter,
//so you can use them in whichever invocation context you want.

window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeST__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};

window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeSI__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};

试试这个
var t=setTimeout(foo,1000)
你还必须定义foo();第一个ofc。
var t=setTimeout(foo,1000)
更好。字符串函数名使用eval。@EliGassert非常正确,非常正确!编辑了我的评论。只是因为您不应该运行该函数,然后将输出放入
setTimeout
。您应该放置函数的“引用”。@Nix函数应该在所有浏览器中执行,因为它正在被调用。它只是在调用setTimeout之前执行。如果foo返回一个函数,这就可以了。非常元——返回函数的函数。但事实并非如此。Daniel在这个问题上是正确的。啊哈,现在我明白了为什么它不起作用,但我仍然不明白为什么当我将它包装在一个匿名函数中时,它会很好地工作。你能详细说明一下吗?@alex23我测试过的所有浏览器都将超时回调的
这个
值设置为调用回调时调用的setTimeout窗口。这包括铬。所以我不明白你在说什么“Firefox bug”。只有在希望将其他参数传递给回调并使其在旧IE版本中工作时,才需要复制/粘贴的代码。但尼克斯并没有试图通过任何额外的论点@亚历克斯23我是投了否决票的人之一,在看到你添加了更详细的解释后,我刚刚取消了投票。然而,这里没有Firefox bug,这只是JavaScript的工作方式。如果你能从你的答案中删除一个不存在的“bug”,那就太好了。
var __nativeST__ = window.setTimeout, __nativeSI__ = window.setInterval;
// just backed up the defaults. Now basically creating timeout and setInterval
//functions that take scope as a parameter,
//so you can use them in whichever invocation context you want.

window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeST__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};

window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeSI__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};