我认为用“var”声明某些内容使其成为其范围的本地。那么,为什么这段代码似乎没有两个名为“len”的不同变量,而只是一个?
for (var i=0, len=3; i<len; i++) {
for (var j=0, len=1; j<len; j++) {
console.log('i=' + i + ', j=' + j + ', len=' + len);
}
}
在输出中,我只得到一行,而不是三行。为什么呢?
(Chrome和Safari上的确认,尚未检查其他人。)
答案 0 :(得分:4)
因为变量是用var
are bound to the function scope声明的,而不是像许多其他语言一样的块范围。例如,这很好用:
if (true) {
var thing = 'something';
}
console.log(thing); // 'something'
但是,这不起作用,因为范围是由函数定义的。
function a() {
var thing = 'something';
}
function b() {
console.log(thing); // ReferenceError
}
a();
b();
答案 1 :(得分:2)
我认为用“var”声明某些内容使其成为其范围的本地。
它确实:功能范围(如果全局使用,则为全局范围)。与许多类似语言中的变量声明不同,var
没有阻止 -scope。因此,在输出一行后,您的循环终止,因为您在内循环的初始值设定项中将len
设置为1
,并且与您使用的len
的{{1}}相同外循环。
var
的那个和其他一些方面非常麻烦,已经修复了:在ES2015(最新的JavaScript规范)中,新的let
具有块范围(并且有一些特殊的手挥动) for
循环),因此您的示例适用于let
:
// NOTE: Only works on browsers supporting `let`!
"use strict"; // (Some browsers don't support let outside of strict mode yet)
for (let i = 0, len = 3; i < len; i++) {
for (let j = 0, len = 1; j < len; j++) {
snippet.log('i=' + i + ', j=' + j + ', len=' + len);
}
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
但是我不建议使用两个嵌套len
之类的。即使JavaScript不会混淆,也不能保证程序员不会在你不会这样做之后。
let
是关于ES2015的几个非常好的事情之一。除了极少数边缘情况外,let
是新的var
。当然,在所有目标浏览器更新其JavaScript引擎之前,您必须坚持使用var
或进行转换。
答案 2 :(得分:0)
你认为将var声称为var使得它在范围内是本地的是正确的。这就是为什么当你在内部for循环中进行比较时,使用的len的值是在内部循环中声明的值。因此只有一行输出。