使用 javascript 限定符 `const` 时,safari 和 chrome 之间的不同行为
Different behavior between safari and chrome when using javascript qualifier `const`
我是 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>
野生动物园:
test
number one
number two
chrome:
test
number one
number one
safari 似乎忽略了 const
限定符。这是未定义的行为吗?幕后发生了什么?
Safari 的行为是正确的。 const
是块作用域的,所以每当循环重复时,前一次迭代的 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 的新手。我想知道为什么代码会在 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>
野生动物园:
test
number one
number two
chrome:
test
number one
number one
safari 似乎忽略了 const
限定符。这是未定义的行为吗?幕后发生了什么?
Safari 的行为是正确的。 const
是块作用域的,所以每当循环重复时,前一次迭代的 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); }
})();