前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Js中var let const 区别

Js中var let const 区别

作者头像
编程内马尔
发布2022-11-15 14:41:25
1.8K0
发布2022-11-15 14:41:25
举报
文章被收录于专栏:编程内马尔

一、前言

在ES6(ES2015)出现之前,JavaScript中声明变量就只有通过 var 关键字,函数声明是通过 function 关键字,而在ES6之后,声明的方式有 var 、 let 、 const 、 function 、 class ,本文主要讨论 var 、 let 和 const 之间的区别。

二、var

如果使用关键字 var 声明变量,那么这个变量就属于当前的函数作用域,如果声明是发生在任何函数外的顶层声明,那么这个变量就属于全局作用域。举例说明:

代码语言:javascript
复制
var a = 1; //此处声明的变量a为全局变量
function foo(){
   var a = 2;//此处声明的变量a为函数foo的局部变量
   console.log(a);//2
}
foo();
console.log(a);//1

如果在声明变量时,省略 var 的话,该变量就会变成全局变量,如全局作用域中存在该变量,就会更新其值。如:

代码语言:javascript
复制
var a = 1; //此处声明的变量a为全局变量
function foo(){
   a = 2;//此处的变量a也是全局变量
   console.log(a);//2
}
foo();
console.log(a);//2
注意:var 声明的变量存在提升(hoisting)。

三、变量声明提升

提升是指无论 var 出现在一个作用域的哪个位置,这个声明都属于当前的整个作用域,在作用域中到处都可以访问到。注意只有变量声明才会提升,对变量赋值并不会提升。如下例所示:

代码语言:javascript
复制
console.log(a);//undefined
var a = 1;

该代码段跟下列代码段是一样的逻辑:

代码语言:javascript
复制
var a;
console.log(a);//undefined
a = 1;

而如果对未声明过的变量进行操作,就会报错

代码语言:javascript
复制
console.log(b);//假设b未声明过,Uncaught ReferenceError: b is not defined

四、let

let 声明的变量,具有如下几个特点:

let 声明的变量具有块作用域的特征。 在同一个块级作用域,不能重复声明变量。 let 声明的变量不存在变量提升,也就是说, let 声明存在暂时性死区(TDZ)。 如下:

代码语言:javascript
复制
let a = 1;
console.log(a);//1
console.log(b);//Uncaught ReferenceError: b is not defined
let b = 2;
function foo(){
    let a = 1;
    let a = 2;//Uncaught SyntaxError: Identifier 'a' has already been declared
}

以下是一个经典的关于 var 和 let 的一个例子:

代码语言:javascript
复制
for (var i = 0; i < 10; i++) {
    setTimeout(function(){
        console.log(i);
    },100)
};

该代码运行后,会打印出10个10.

若修改为:

代码语言:javascript
复制
for (let i = 0; i < 10; i++) {
    setTimeout(function(){
        console.log(i);
    },100)
};

则该代码运行后,就会打印出0-9.

五、const

const 声明方式,除了具有 let 的上述特点外,其还具备一个特点,即 const 定义的变量,一旦定义后,就不能修改,即 const 声明的为常量。

例如:

代码语言:javascript
复制
const a = 1;
console.log(a);//1
a = 2;
console.log(a);//Uncaught TypeError: Assignment to constant variable.

但是,并不是说 const 声明的变量其内部内容不可变,如:

代码语言:javascript
复制
const obj = {a:1,b:2};
console.log(obj.a);//1
obj.a = 3;
console.log(obj.a);//3

所以准确的说,是 const 声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。

六、总结

var 声明的变量属于函数作用域,let 和 const 声明的变量属于块级作用域; var 存在变量提升现象,而 let 和 const 没有此类现象; var 变量可以重复声明,而在同一个块级作用域,let 变量不能重新声明,const 变量不能修改。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档