JavaScript 递归和闭包?

标签 javascript

我有这个功能(示例:http://jsbin.com/emabe4/)

var a=[];
var log = document.getElementById('log');

function loop(x){

  x++;
  a.push(x);

  if (x < 10){
    log.innerHTML = log.innerHTML + "<br/>" + a;
    console.log(a);
    loop(x)
  }

}

随着循环递归地调用自身,数组会变长,并用内部 HTML 写出,如下所示:

[1]
[1,2]
...
[1,2,3,4,5,6,7,8,9]

这就是我希望的工作方式。

但是如果您查看控制台日志,您会看到以下内容:

[1,2,3,4,5,6,7,8,9]
[1,2,3,4,5,6,7,8,9]
...
[1,2,3,4,5,6,7,8,9]

问题:

1)为什么innerHTML和console.log之间存在差异?

2)控制台日志似乎是实际创建的内容,我认为这是由于关闭问题造成的,对吗?如果是这样,有什么解决方法可以做到我想要它做的事情(前者,我可以在数组每次增长时逐步与数组交互)?我之前已经在 while 循环中解决了这个问题,但不知道如何在这里处理它。

最佳答案

console.log(a) is 应该被严格评估,并且将具有与innerHTML相同的结果。这可以使用 console.log(""+ a) 进行验证(或反驳)。正如帖子和评论所示,这因浏览器而异(Chrome 在这里很懒,Firefox 很严格)。

console.log(""+ a) 的情况下,它强制a 中的对象计算为字符串表示形式.

在所有情况下都只有一个a(更重要的是,只有一个数组传递到console.log)。也就是说,这不是代码的闭包问​​题,而是延迟将对象转换为字符串表示形式的问题(在 Chrome 中)。如果它将转换推迟到循环完成之后,则行为将如所描述的那样,它将连续打印出同一个对象 n (10) 次。

祝你编码愉快。

关于JavaScript 递归和闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5427631/

相关文章:

javascript - 检查嵌套数组中的每个值是真还是假的更好方法?

javascript - 德国风格的铁路时钟。 SVG 的可怕使用?

javascript - 了解离屏 Canvas 以获得更好的性能

php - 我可以使用 ajax 而不是文本框更新标签吗?

用于 Javascript 正则表达式的 Javascript 正则表达式测试器

javascript - Angular 6 如何在单击按钮后显示消息

javascript - 谷歌地图 API : Refresh ImageMapType Overlay

javascript - jquery slider 和 amchart 的问题

javascript - 如何使用jquery更改为所需的日期格式?

javascript - 如何列出输入字段中提交的所有人员?