由于JS引擎的工作方式,是先获取所有被声明的变量再逐一执行,所以变量的声明语句都会被提升到当前代码块的头部。
例1:
var a = 1;
function test1(){
alert(a);
var a = 2;
alert(a);
}
test1();//undefined,2
输出结果是undefined,2,并不是1,2,实际执行顺序:
var a = 1;
function test1() {
var a; //变量提升,先声明a(当局部变量与全局变量重名时,局部变量优先级高于全局变量,所以会覆盖全局变量,此时的a只有声明却未定义)
alert(a);//所以执行alert值为undefined
a = 2;
alert(a);//此时a=2
}
test1();
例2:
function test2() {
alert("before for scope:" + i); //不会报错,undefined,变量提升i已声明未赋值
for (var i = 0; i < 3; i++) { //for不存在作用域之说
alert("in for scope:" + i); // i的值是 0、1、2, 当i为3时跳出循环
}
alert("after for scope:" + i); // i的值是3,注意,此时已经在for scope以外,但i的值仍然保留为3
while (true) {
var j = 1;
break;
}
alert(j); // j的值是1,注意,此时已经在while scope以外,但j的值仍然保留为1
if (true) {
var k = 1;
}
alert(k); //k的值是1,注意,此时已经在if scope以外,但k的值仍然保留为1
}
test2();
alert(i); //此处报错,i指的是全局变量,is not defined(未定义),程序中断
注意:
1.当局部变量与全局变量重名时,局部变量优先级高于全局变量,所以会覆盖全局变量;
2.全局变量是指在函数外定义,全局可访问;局部变量是指函数内定义,外部不能正常访问;
3.函数作用域是指function的作用域,像if/while等并没有作用域;
4.is not defined是指变量未定义(未声明),undefined则是指变量已经声明但可能未赋值等其他原因;
5.undefined不影响运行,is not undefined会直接报错,中断运行;
6.在函数内部定义变量时,如果不加var而是直接如i = 1这种,实际相当于定义了一个全局变量;