4

私はこれがよく使われているのを見て、引用符の間に関数参照を置くのは悪いと言われましsetTimeoutsetInterval evals。これら 2 つの実際の違いは、一方が他方よりも使用されていることと、この一方の方法が悪いことはよく知られているはずなのに、なぜこれが頻繁に使用されているのですか?

4

3 に答える 3

3
  1. 人々は、引用符なしの形式を使用できることに気付いていないかもしれません。

  2. 文字列で参照されている名前は、まだ定義されていない可能性があります。

  3. 引用された形式では、実行が遅れます。

    setTimeout("myFunction(1, 'hello')", 100)
    

    よりも理解しやすい:

    setTimeout(function () { myFunction(1, 'hello') }, 100)
    

    そして、これは作者が望んでいることをしません:

    setTimeout(myFunction(1, 'hello'), 100)
    
于 2012-07-24T01:20:27.283 に答える
1

これら 2 つの形式には、主に次の 2 つの違いがあります。

setTimeout("myFunc()", 100);

setTimeout(myFunc, 100);

最初のものは効率が悪く、関数をグローバル スコープで評価するため、ローカル関数やグローバルではない関数を渡すことはできません。

効率の引数を見て、コードにある関数を呼び出したい場合は、次のように記述します。

x = myFunc();

または、次のように書きますか。

x = eval("myFunc()");

もちろん、次の理由で最初のものを書きます。

  1. それがあなたが通常javascriptを書く方法です
  2. 関数参照は、実行するたびに解決するのではなく、インタープリターの最初のパスで一度解決できます。
  3. ミニファイアー/オプティマイザーは、最初のシンボルの名前を変更できますが、2 番目のシンボルの名前を変更することはできません。
  4. 最初の関数でローカル関数を呼び出すことができますが、2 番目の関数にはグローバル関数が必要です
  5. eval()他に良い方法がない場合にのみ使用する必要があるかなり重いものです。

参考までに、この jsPerf の比較は、eval()バージョンが 96% 遅いことを示しています。状況によってはパフォーマンスが問題にならないこともありますが、どれだけ効率が悪いかがわかります。

于 2012-07-24T01:46:55.300 に答える
0

メモリリークも防止できると思います。

漏れません X:

var x = $("loading");
setTimeout("createTree(1);", 0);

リークのX:

var x = $("loading");
setTimeout(function(){createTree(1);}, 0);
于 2012-07-24T01:36:05.913 に答える