正如其他答案中已经说明的那样,您的代码不起作用,因为您没有使用 声明i
变量var
,这会自动使其成为全局变量。所以不是真正的功能与块范围问题。如果你var
用来声明你的变量,那么变量的范围将被限制在声明包含在任何嵌套函数中的同一个函数中,或者如果不在函数中,则为全局。
如果您在嵌套函数中使用相同的变量名称,则内部范围内的变量称为“遮蔽”外部变量;在这种情况下,内部函数无法访问该名称的外部函数变量,因为使用该名称只会给它自己的变量。可以这么说。尽管您可以通过将全局变量视为window
对象的属性来访问它们。
“我想知道的是如何保留这种行为。我的意思是强制使用块作用域之类的东西。否则很容易产生非常讨厌的错误......”
不,一旦您开始var
正确使用,避免这些错误并不难。但是你可以通过引入一个立即调用的匿名函数来强制块作用域:
(function() {
// variables created in this function are accessible
// only within this function
var x, y, z;
})();
console.log(typeof x); // "undefined" (x can't be seen from outside the function)
括号function(){}
是必需的,以便函数被解释为表达式而不是函数语句;最后的额外()
内容是使该函数表达式立即执行。这种结构的一个常见用途是将整个脚本包含在其中,这样其中的变量或函数就不会成为全局变量,因此不会与从其他 JS 包含文件加载的其他脚本交互。(您可以在块内的多个函数之间共享伪全局变量,这些函数也在块内声明。)
因此,例如,如果您想将for
语句的主体变成具有范围的“块”,您可以这样做:
for (var i = 0; i < something; i++) {
(function() {
var x = i;
// do something with x
})();
}