什么时候执行JavaScript语句?

时间:2016-04-19 22:34:40

标签: javascript runtime

我有以下代码:

<html>
  <body>
    <p>para 1</p>
    <p>para 2</p>
    <script>
      var allP = document.getElementsByTagName("p");
      for (var i = 0; i < allP.length; i++) {
        console.log(i);
        allP[i].onclick = function () {
          alert("p" + i + " was clicked."); // expected: i = 0..n-1; actual: i = n
        }
      }
    </script>
  </body>
</html>

当我打开控制台时,我可以看到循环迭代了两个段落标记:01被打印到日志中。

当我点击第一个p标签时,我现在希望收到一条警告,其中点击了“p 0 ”。然而,我得到的是“p 2 被点击了。”

为什么呢?我假设,当我将"p" + i + " was clicked."传递给alert时,i会转换为字符串 - 但它似乎是对i中存储的Number对象的引用(在调用匿名函数时会动态转换) - 当然,在循环运行后,n(即allP.length)。

有人可以向我解释发生了什么(当警报的参数被“构建”/评估时),这种行为被称为什么(我不认为像Java这样的编译语言,或像PHP3这样的解释语言/ 4,会表现那样吗?),以及我需要做些什么来获得我期待的行为(即让警报消息引用被点击的元素的索引(不必自己静态地写出每条消息))。

0 个答案:

没有答案