0

という印象を受けました

setInterval("/*some code*/", time)

と同等でした

setInterval(function() {
   /*some code*/
}, time)

どうやらそうではありません!以下を比較してください (完全な HTML):

<pre id=p><script>n=setInterval("for(n+=7,i=k,P='p.\\n';i-=1/k;P+=P[i%2?(i%2*j-j+n/k^j)&1:2])j=k/i;p.innerHTML=P",k=64)</script>

<pre id=p><script>n=setInterval(function() { for(n+=7,i=k,P='p.\\n';i-=1/k;P+=P[i%2?(i%2*j-j+n/k^j)&1:2])j=k/i;p.innerHTML=P },k=64)</script>

2 つのアニメーション (最初のアニメーションはここから取得) は異なります。

2 つの構造が同等でないのはなぜですか?

答え: 少なくとも 3 つの違いがあります

  1. 可変範囲
  2. パフォーマンス
  3. 文字列のエスケープ
4

3 に答える 3

6

setTimeout難読化されたコードについては調べていませんが、 orで文字列を使用する場合と関数を使用する場合の違いはsetInterval、コードが実行されるスコープです。また、文字列を使用する場合、エンジンによっては最適化できない場合もあります。

  • 文字列を渡すと、グローバル スコープで実行されます。

  • 関数を渡すと、定義されているスコープで実行されます。

これは、コードのスコープ内にある変数に影響を与え、コードの動作に影響を与える可能性があります。

難読化されていない例を次に示しますソース

(function() {
  var foo = 42;

  // This will say "undefined", because there is no global `foo`
  setTimeout("display(typeof foo);", 0);

  // This will say "number", because the function is closure over
  // the current scope, whcih *does* have `foo`
  setTimeout(function() {
    display(typeof foo);
  }, 0);

})();

function display(msg) {
  var p = document.createElement('p');
  p.innerHTML = String(msg);
  document.body.appendChild(p);
}
于 2012-04-28T14:10:47.180 に答える
3

これら 2 つの形式の setInterval は本質的に同等ですが、コードは異なります。\\n2 番目の例では、改行を だけではなくとしてダブルエスケープしています\n。これを試して:

<pre id=p><script>n=setInterval(function() { for(n+=7,i=k,P='p.\n';i-=1/k;P+=P[i%2?(i%2*j-j+n/k^j)&1:2])j=k/i;p.innerHTML=P },k=64)</script>

そして、それはあなたが望むものと同じでなければなりません。

setIntervalのfunction()形式は多くの点で優れています。より読みやすく、ここで遭遇したように、文字列内の文字列をエスケープしようとすることに対処する必要はありません。

于 2012-04-28T14:13:15.727 に答える
1

あなたの例を理解しているかどうかはわかりませんが、私が知る限り、2つの主な違いの1つは、 setInterval(string, time) が setInterval(function, time) よりもパフォーマンスが低いことです。 eval() と同じように、オンザフライでコードを記述します。それに加えて、コードは毎回 Dom を操作するため、パフォーマンスが低下します。

JavaScript はシングル スレッドであるため、setInterval の間隔時間は正確ではありません。これについては、John Resig の投稿を参照してください: http://ejohn.org/blog/how-javascript-timers-work/

setInterval(string, time) のパフォーマンスの低下と非常に短い間隔に基づいて、結果が異なると予想されます。

于 2012-04-28T14:17:57.350 に答える