javascript - setInterval ("/*some code*/", time) 和 setInterval(function() {/*一些代码*/}, time)

标签 javascript html

我的印象是

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. 字符串字符转义

最佳答案

我还没有研究过混淆的代码,但是使用字符串和带有 setTimeoutsetInterval 的函数之间的区别在于代码运行的范围。另外,当您使用字符串时,某些引擎可能也无法优化。

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

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

这会影响哪些变量在代码范围内,从而影响代码的功能。

这是一个未混淆的示例: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);
}

关于javascript - setInterval ("/*some code*/", time) 和 setInterval(function() {/*一些代码*/}, time),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364235/

相关文章:

Javascript/Jquery 无法将 dom 元素设置为 ajax 结果

javascript - 如何只允许白名单资源(脚本、像素等)在沙盒 iframe 中运行?

javascript - 根据下拉列表中更改的选择触发观察者 - Ember.js

html - 如何居中对齐包含在列表中的图像?

css - 为什么调整窗口大小时输入标签不收缩

javascript - 浏览器对 "digitalbazaar/forge"库的支持是什么( native JavaScript TLS 实现)

javascript - 在具有多个图案的图案中旋转单个图案

javascript - 如何使网页在移动设备上保持事件状态?

javascript - 使用 View 图像而不是使用以下代码缩放图像

html - 使用 UTF8 编码(仅限西里尔文字)的网站上的重音标记位置不正确