简述变量的声明方式(一)

许久未写过博客了;果然懒惰是人类的一大天敌;重头开始;望共勉;

简述变量的声明方式(一)

我们都知道目前在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的机制便是首先获取的是当下作用域中的变量。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

feng_初学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值