var、let、const的区别

文章介绍了ES6中引入的块级作用域概念,如何解决ES5中内层变量覆盖外层变量和循环变量泄漏的问题。let和const声明的变量具有块级作用域,不会变量提升,且不允许重复声明。const用于声明常量,必须初始化且其指向的内存地址不可变。var声明的变量则有函数作用域,存在变量提升现象,并且可以在全局作用域中作为window对象的属性。
摘要由CSDN通过智能技术生成

1.块级作用域
级作用域由{ }包括,let和const是块级作用域,通常情况下范围比var要小;var不存在块级作用域,是方法作用域,只要在方法内定义了,整个方法中定义变量后的代码都可以使用这个变量。

块级作用域解决了ES5中的两个问题:
● 内层变量可以覆盖外层变量
● 用来计数的循环变量泄漏为全局变量
ES5中只有全局作用域和函数作用域,没有块级作用域,因此会带来上述两个问题。

2.变量提升
var声明的变量存在变量提升,但是let和const不存在,即只能在变量声明之后使用,否则会出错。

3.给全局添加属性
浏览器的全局对象是window,Node的全局对象是global,var声明的全局变量和函数,会被添加为window对象的属性和方法,但是使用 let 和 const 的顶级声明不会定义在全局上下文中,但在作用域链解析上效果是一样的。

if (true) {
  var bar = 'bar';
  let baz = 'baz';
  const qux = 'qux';
}

// 用 var 声明的变量在函数作用域上都可访问
console.log(bar); // bar
// let 和 const 定义的变量在它们被定义的语句块之外不可访问
console.log(baz); // ReferenceError: baz is not defined
console.log(qux); // ReferenceError: qux is not defined
function foo() {
  // 所有变量在函数中都可访问
  var bar = 'bar';
  let baz = 'baz';
  const qux = 'qux';

  console.log(bar); // bar
  console.log(baz); // baz
  console.log(qux); // qux
}

console.log(bar); // ReferenceError: bar is not defined
console.log(baz); // ReferenceError: baz is not defined
console.log(qux); // ReferenceError: qux is not defined

4.重复声明
var声明的变量,可以被重复声明,后声明的同名变量会自动覆盖之前声明的变量,但是let和const不可以。

5.暂时性死区
在使用let、const来声明变量之前,该变量是不能使用的,在声明变量前使用会报错,这在语法上称为暂时性死区。而var不存在这样的暂时性死区。

6.初识值设置
在声明变量时,var和let是不需要赋初始值的,但是const为常量声明方式,声明变量时必须初始化,在后面出现的代码中不能再修改该常量的值。const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。

7.指针指向
let和const都是ES6新增的用于创建变量的语法,let创建的变量可以更改指针的指向,也就是可以重新赋值,但是const不可以,它是常量声明方式。

重新定义修改值声明提升块级作用域循环
var可以可以严格来说不支持(function 支持)
let不可以可以不会支持
const不可以不可以(除数组和对象)不会支持
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值