简单认识js作用域
var a = 1;
if(true){
var b = 1;
}
console.log(b) //1
在面向对象的强语言中(Java,C……),其作用域都是基于块的(即:{}),块内可以对块外的变量进行操作,但是块外却对块内的变量是无法操作的。但是JS呢?一门弱语言,其并没有实现基于块的作用域,而是基于function的,
因此上面的代码运行出来的结果b并不是undefined,说明最终a和b是定义在一个Scope内的。
预编译(变量提升)
var a = 1;
var b = 2;
function doit(){
console.log(b);
var b = 3;
console.log(b);
}
doit();
console.log(b);
//undefined
//3
//2
相当于下面
var a = 1;
var b = 2;
function doit(){
var b;
console.log(b);
b = 3;
console.log(b);
}
doit();
console.log(b);
//undefined
//3
//2
讲到了Scope,不得不讲一讲js的预编译,为什么我们得到的第一个log的结果为undefined呢?按照强语言的思路来说这里应该是2才对呀,这就是js的预编译。js的代码在首次被加载完成后进行编译时,会将所有的function和var提前进行声明,但是并不会对其进行赋值,赋值则都是在该代码块进行执行时才会对其进行赋值,那么第一个log则是在预编译为b进行了声明后,这时b是没有时行赋值的,所以会log出undefined。
由于js是基于function来创建Scope的,所以只有doit执行时才会创建新的Scope