3

Firefox(v16)で次の機能が動作しないのはなぜですか?

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

コンソールに表示されるエラーは、「役に立たないsetTimeout呼び出し(引数の前後に引用符がありませんか?)」です。引用符で囲むことは、文字列としてレンダリングすることを除いて、あまり効果がないようです(当然のことながら)。

ただし、次のように匿名関数でラップすると正常に機能します。

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

しかし、なぜそれが必要なのでしょうか?WebkitやOperaで爆発しないのはなぜですか?運のストローク?

4

2 に答える 2

10

fooこれは、最初の例で呼び出しているためです。

基本的にこれを行うのと同じです:

var tempResultOfFoo = foo();
var t = setTimeout(tempResultOfFoo, 1000);
于 2012-11-13T20:07:58.463 に答える
0

メソッドをに渡すとsetTimeout()、グローバルスコープで実行されます。 実行時thisにポイントします。window詳しくはこちらをご覧ください。

グローバルでない場合foo、それは見つかりません、ergo 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);
};
于 2012-11-13T20:11:11.300 に答える