javascript - 使用 javascript 限定符时 safari 和 chrome 之间的不同行为 `const`

标签 javascript google-chrome safari constants

我对 JavaScript 很陌生。我想知道为什么代码打击会在 safari 和 chrome 之间给出两种不同的结果。

<!DOCTYPE html>
<html>
  <head>
    <h1> test </h1>
  </head>
  <body>
    <div id='test'> </div>
    <div id='num0' style='display:none'> number one</div>
    <div id='num1' style='display:none'> number two</div>

    <script type="text/javascript">
      for (var i = 0; i <2; i++){
        const data = document.getElementById("num"+i).innerHTML;
        var newDiv = document.createElement("div");
        newDiv.id = i;
        newDiv.innerHTML = data;
        document.getElementById('test').appendChild(newDiv);
      }
    </script>
  </body>
</html>

Safari :

test
number one
number two

Chrome :

test
number one
number one

似乎 safari 忽略了 const 限定符。这是未定义的行为吗?幕后发生了什么?

最佳答案

Safari 的行为是正确的。 const 是 block 作用域的,因此每当重复循环时,前一次迭代的 const 限定变量不再可用,因此新的 const data 声明可以成功 - 就像 let 一样。在严格模式下,Chrome 的行为也与 Safari 类似。

在非严格模式下,Chrome 使用 const 的旧形式,其中 (const) 变量声明被提升,并且更新变量的尝试将被静默忽略。

示例:

function log(msg) {
    document.body.appendChild(document.createElement('div')).textContent = msg;
}
(function() { // Chrome 45 (BAD) : 0 0 0
    log('No strict mode');
    for (var i = 0; i < 2; ++i) {
        const data = i;
        log(data);
    }
    try {
        log(data); // Should fail
    } catch (e) { log(e); }
})();
(function() { // Chrome 45 (GOOD): 0 1 ReferenceError: data is not defined
    'use strict';
    log('In strict mode');
    for (var i = 0; i < 2; ++i) {
        const data = i;
        log(data);
    }
    try {
        log(data); // Should fail
    } catch (e) { log(e); }
})();

关于javascript - 使用 javascript 限定符时 safari 和 chrome 之间的不同行为 `const`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32665347/

相关文章:

javascript - iPad 上支持的 JavaScript 事件列表

javascript - IE 中未定义内联 onclick

javascript - 打开新标签页后 Chrome 扩展程序退出运行 javascript

css - Chrome 浏览器中 css 网格的奇怪行为?

ios - 无法在 Safari (iOS) 上访问网站

通过 USB 连接的 iPad 在 iOS 11 上不久后从 Safari 开发菜单中消失

javascript - 如何使用 javascript 和/或 jQuery 获取特定类中所有元素的数组?

javascript - JavaScript 表达式求解器

java - GWT - 向页面添加元素后的 CSS 动画

javascript - 打开弹出窗口后谷歌浏览器上出现奇怪的行,如何避免?