许久未写过博客了;果然懒惰是人类的一大天敌;重头开始;望共勉;
简述变量的声明方式(一)
我们都知道目前在JavaScript中常见的三种声明变量的方式:var,let,const。
我们首先从古老的var开始。
声明方式:var a;
这里简单提一句很多同学有时会认为var a = 1;
这样也是声明,其实这种是声明式赋值,是先声明,后赋值。
关于var的各种声明情况
情况1
var a;
console.log(a);
a = 0;
console.log(a);
输出 undefined 0
console.log(a);
var a = 0;
console.log(a);
输出 undefined 0
a = 0;
console.log(a);
输出 0
首先第一个是常规的声明方式,我们现在要解释的是第二个,为什么先输出后声明赋值没有报错:a is not defined。因为js属于弱类型语言,在var声明的情况下a会在js预解析时进行变量提升,会变成第一种的声明方式。而第三种是js的处理机制中非严格模式下,没有写声明的变量直接赋值,默认创建一个全局变量。
情况2
var a = b = 0;
console.log(a, b);
输出 0 0
console.log(a, b);
var a = b = 0;
输出 b is not defined
在情况1的时候,我们说到var是会进行变量提升的,那为什么这里报错了呢?在刚开始的时候我们就提到了一点‘=’这是赋值,并不是声明,我们来拆分一下var a = b = 0;
拆分为var a; b = 0; a = b;
这里我们可以清晰的看到第一次我们的赋值已经完成了所以可以正常输出,而第二次,我们是先输出,理清解析顺序:声明 a => 然后log,为什么b没有声明呢,因为还没有执行到b=0;这里还未创建全局变量b,所以报错。变量的提升,提升的是声明而不是赋值这点很重要,这两者需要区分开。
情况3
var a;
(function () {
a = 1;
console.log(a);
})();
console.log(a);
输出 1 1
此情况是当前作用域没有声明,所以1是赋给了全局的a
var a;
(function () {
var a = 1;
console.log(a);
})();
console.log(a);
输出 1 undefined
在此情况下,我们需要注意的是作用域的问题第一个a是全局的a声明,而第二个a是在局部作用域中,js的机制便是首先获取的是当下作用域中的变量。