变量提升和块级作用域
变量提升 JavaScript引擎的工作方式是先解析代码,获取所有被声明的变量,然后一行一行的执行。所有变量的声明语句被提升到代码的头部,这就叫变量提升。 实例1: 1 console.log(a); 2 var a = 1; 以上语句不会报错,只提示 undefined 。 实际运行过程: 1 var a; 2 console.log(a); 3 a = 1; 变量a已经声明,但还未赋值。 变量的提升只会对var命令声明的变量有效,其他不是用var命令声明的变量,不会发生变量的提升。 实例2: 1 console.log(a); 2 a = 1; 以上代码将会报错: ReferenceError: aa is not defined 。 与普通变量一样,js里面的 function 也可看做变量,也存在变量提升的情况: 实例3: 1 a(); 2 function a(){ 3 console.log(1); 4 } 表面上声明之前调用函数a。由于变量提升,函数a定义部分被提升到了代码头部,即调用之前已经声明。 采用赋值语句定义函数会报错 TypeError: a is not a function 。 实例4: 1 a(); 2 var a = function(){ 3 console.log(1); 4 }; 以上代码会报错 TypeError: a is not a