首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >setInterval("/*some代码*/“,时间)和setInterval(函数(){ /*some代码*/ },时间)

setInterval("/*some代码*/“,时间)和setInterval(函数(){ /*some代码*/ },时间)
EN

Stack Overflow用户
提问于 2012-04-28 14:05:17
回答 3查看 146关注 0票数 0

我的印象是

代码语言:javascript
代码运行次数:0
运行
复制
setInterval("/*some code*/", time)

相当于

代码语言:javascript
代码运行次数:0
运行
复制
setInterval(function() {
   /*some code*/
}, time)

显然不是!请比较以下内容(完整的HTML):

代码语言:javascript
代码运行次数:0
运行
复制
<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>

代码语言:javascript
代码运行次数:0
运行
复制
<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>

这两部动画(第一部取自这里)是不同的。

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

答案:至少有三个不同之处

  1. 可变范围
  2. 性能
  3. 字符串转义
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-28 14:13:15

这两种形式的setInterval本质上是等价的--但您的代码不是。在第二个例子中,您将换行符双转义为\\n,而不仅仅是\n。试试这个:

代码语言:javascript
代码运行次数:0
运行
复制
<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>

这应该是你想要的。

function()形式的setInterval在很多方面都更好--它更易读,当您在这里遇到时,您不需要处理在字符串中转义字符串的问题。

票数 3
EN

Stack Overflow用户

发布于 2012-04-28 14:10:47

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

  • 当您传入一个字符串时,它将在全局范围运行。
  • 当您传入一个函数时,它将在定义它的作用域中运行。

这会影响代码的作用域中的变量,这会影响代码所做的工作。

下面是一个没有混淆的示例:活拷贝 \ 来源

代码语言:javascript
代码运行次数:0
运行
复制
(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);
}
票数 6
EN

Stack Overflow用户

发布于 2012-04-28 14:17:57

我不确定我是否理解您的示例,但据我所知,这两者之间的主要区别之一是,setInterval(string,time)的性能将不如setInterval(函数、时间),因为它需要动态地解释代码,就像eval()一样。此外,您的代码每次都会操作Dom,这是性能上的问题。

由于javascript是单线程的,所以setInterval中的间隔时间并不准确。参见John关于这方面的文章:http://ejohn.org/blog/how-javascript-timers-work/

根据setInterval(string,time)的性能损耗和相当小的间隔,我希望结果是不同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10364235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档