我的印象是
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)是不同的。
为什么这两个结构不相同?
回答:至少存在三个差异
答案 0 :(得分:6)
我没有研究过混淆代码,但使用字符串和函数setTimeout
或setInterval
之间的区别在于代码运行的范围。此外,当您使用字符串时,某些引擎可能也无法进行优化。
当您输入字符串时,它会在全局范围内运行。
当您传入函数时,它会在其定义的范围内运行。
这会影响哪些变量在代码的范围内,这会影响代码的作用。
这是一个没有混淆的例子: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);
}
答案 1 :(得分: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()
形式在很多方面都更好 - 它更具可读性,而且当你遇到这里时,你不必处理尝试在字符串内部转义字符串。
答案 2 :(得分:1)
我不确定我理解你的例子,但据我所知,两者之间的主要区别之一是setInterval(字符串,时间)的性能将低于setInterval(函数,时间),因为它需要动态解释代码,方法与eval()相同。 除此之外,您的代码每次操作Dom都会影响性能。
由于javascript是单线程的,因此setInterval中的间隔时间并不准确。请参阅John Resig的帖子:http://ejohn.org/blog/how-javascript-timers-work/
根据setInterval(字符串,时间)的性能消耗和相当小的间隔,我希望结果会有所不同。