在 C 或者 Java 等语言中,if、for 等语句块内可以包含自己的局部变量,这些变量的作用域是这些语句的语句块,而在 Javascript 中,不存在「块级作用域」的说法。
function checkScope(obj){
var i=0;
if(typeof obj =='object'){
var j =0;
for (var k=0;k<=10;k++){
console.log(k);
}
console.log(k);
}
console.log(j);
}
checkScope(new object());
在上面的例子中,每一条控制台输出语句都能输出正确的值,这是因为,由于JavaScript中不存在块级作用域,因此函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都有定义。
如果要更加强调上文中函数中函数中声明的所有变量,无论在哪里声明的,在整个函数中它们都是有定义的。即使在声明之前。
var a=2;
function test (){
console.log(a);
var a=10;
}
test();
在上面的例子中,控制台输出变量a的值为undefined,即不是全局变量a的值2,也不是局部变量a的值10。首先局部变量在整个函数体内都是有定义的,局部变量a会在函数体内覆盖全局变量a,而在函数体内,在var语句之前,它是不会被初始化的。
如果要读取一个未被初始化的变量。将会得到一个默认值undefined。
所以上面的示例写的代码与下面的代码是等价的
var a=2;
function test(){
var a;
console.log(a);
a=10;
}
把所有的函数声明集合起来放在开头是一个好习惯。