2012-04-28 68 views
0

我的印象是的setInterval( “/ *一些代码* /”,时间)和setInterval(函数(){/ *一些代码* /},时间)

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> 

两个动画(从here采取的第一个福利)是不同的。

为什么这两个构造不等价?

:至少有三点不同

  1. 变量范围
  2. 性能
  3. 串字符转义
+1

WTF对你有问题吗?您是否从混淆的JavaScript比赛中获得了此代码?认真... – ddaa 2012-04-28 14:07:44

+0

是的,可能。所以呢?这是一个非常好的学习练习。 – Randomblue 2012-04-28 14:10:11

+3

我质疑从混淆比赛中学习编程语言的智慧。 – ddaa 2012-04-28 14:13:50

回答

3

这两种形式的setInterval的基本上相当于 - 但你的代码是没有的。在第二个示例中,您将双线转义为\\n,而不仅仅是\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()形式在很多方面都更好 - 它更具可读性,而且当您跑到​​这里时,您不必处理尝试在字符串中转义字符串的操作。

6

我没有研究过混淆代码,但差异在使用字符串和函数之间使用setTimeoutsetInterval是其中cod e运行。另外,当您使用字符串时,某些引擎可能无法进行优化。

  • 当你传入一个字符串时,它会在全局范围内运行。

  • 当你传入一个函数时,它会在它定义的范围内运行。

这会影响哪些变量在代码的作用域中,这会影响它的功能。

下面是一个没有模糊的例子:Live copy | source

(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); 
} 
+0

我明白了,谢谢澄清。 – Randomblue 2012-04-28 14:11:30

+0

我只是想说这个。 – 2012-04-28 14:12:16

1

我不确定我理解你的例子,但据我所知,两者之间的主要区别之一是setInterval(string,time)比setInterval(function,time)的性能低,因为它会需要像使用eval()一样快速解释代码。 除此之外,您的代码每次操作Dom都会影响性能。

由于javascript是单线程的,因此setInterval中的间隔时间并不准确。看看John Resig的职位有关:http://ejohn.org/blog/how-javascript-timers-work/

我希望基于setInterval的性能漏极(字符串,时间)和相当小间隔的结果是不同的。