考虑以下代码
double data[][];
if(winner)
data=new double[16][5];
else
data=new double[14][5];
我希望Chrome开发者工具中的输出为:
<!DOCTYPE html>
<html>
<head>
<script>
var name = 0;
while ( name < 6 ) {
console.log('Masha');
name = name + 1;
console.log(name);
}
</script>
</head>
<body>
</body>
</html>
相反,我得到
Masha
name.html:9 1
name.html:7 Masha
name.html:9 2
name.html:7 Masha
name.html:9 3
name.html:7 Masha
name.html:9 4
name.html:7 Masha
name.html:9 5
name.html:7 Masha
name.html:9 6
为什么会这样?如果我直接复制/粘贴代码也会发生这种情况。如果我砍掉Masha
name.html:9 01
name.html:7 Masha
name.html:9 011
的{{1}},那么它确实有效。如果我将变量更改为n
,它确实有效。为什么它被强制转换为字符串?我正在使用name
Chrome。它也发生在Firefox myName
。
当我在节点或Internet Explorer中运行代码时,不会发生这种情况。
答案 0 :(得分:5)
因为您在浏览器中使用全局范围内的name
。浏览器已经有一个内置的name
全局(特别是name
的属性window
,这是窗口的名称),它始终是一个字符串。之一:
使用其他名称或更好的名称:
请勿使用全球
这是一个很好的例子,说明为什么不使用全局变量是一个好主意。 : - )
以下是#2的例子:
(function() {
var name = 0;
while ( name < 6 ) {
console.log('Masha');
name = name + 1;
console.log(name);
}
})();
既然name
不再是全球性的(你用一个名为name
的局部变量阴影),一切都很好。
在正确支持ES2015 let
*的浏览器中,您也可以使用let
,因为使用let
(以及const
和class
)创建的变量是全局变量,但不是全局对象的属性。即使在全球范围内,您的let name
也会影响来自该地产的全局:
let name = 0;
while ( name < 6 ) {
console.log('Masha');
name = name + 1;
console.log(name);
}
但同样,只是不使用全局是最好的。
*注意:某些浏览器有let
但没有正确的ES2015语义,例如IE11(它在let
循环标头声明中缺少for
周围的一些重要功能,它没有'给每个循环迭代它的拥有 a
,对for
的主体中创建的闭包产生影响,但是大多数现代浏览器 - 当然是Chrome,Firefox和Edge - 正确支持它。 IE11的let
也可以在上面的情况下工作(而不是for
循环情况)。