JavaScript 中的let和const

ECMA Script2015(ECMA scri 6)
ES2015(ES6)新增加两个重要的JavaScript关键字:let和const。
let声明的变量只在let命令所在的代码块内有效。
const声明一个只读的常量,一旦声明,常量的值就不能改变。
在ES6之前,JavaScript只有两种作用域:全局变量与函数内的局部变量。

全局变量:
在函数外声明的变量作用域是全局的:
实例:
var carName=“Volvo”;
//这里可以使用carName变量
function myFunction(){
//这里也可以使用carName变量
}

局部变量:
在函数内声明的变量作用域是局部的(函数内):
实例:
//这里不能使用carName变量
function myFunction(){
var carName=“Volvo”;
//这里可以使用carName变量
}
//这里不能使用carName变量
函数内使用var声明的变量只能在函数内容访问,如果不使用var则是
全局变量。

javas块级作用域(Block Scope)
使用var 关键字声明的变量不具备块级作用域的特性,它在{}外依然
能被访问到。
{
var x=2;
}//这里可以使用X变量

在ES6之前,是没有块级作用域的概念的。
ES6可以使用let关键字来实现块级作用域。
let声明的变量只在let命令所在的代码块{}内有效,在{}之外不能访问。
{
let x=2;
//这里不能使用X变量
}

重新定义变量
使用var关键字重新声明变量可能会带来问题。
在块中重新声明变量也会重新声明块外的变量:
实例:
var x=10;
//这里输出X为10
{
var x=2;
}

let关键字就可以解决这个问题,因为它只在let命令所在的代码块{}内有效。
实例
var x=10;
//这里输出X为10
{
let x=2;
//这里输出X 为2
}
//这里输出X为10

nternet Explorer 11 及更早版本的浏览器不支持 let 关键字。

下表列出了各个浏览器支持 let 关键字的最低版本号。

Chrome 49 IE / Edge 12 Firefox 44 Safari 11 Opera 36
Mar, 2016 Jul, 2015 Jan, 2015 Sep, 2017 Mar, 2016
循环作用域
使用var关键字:
实例:
var i = 5;
for (var i = 0; i < 10; i++) {
// 一些代码…
}
// 这里输出 i 为 10

使用let关键字:
实例:
let i=5;
for(let i=0;i<10;i++){
//一些代码
}
//这里输出i为5

在第一个实例中,使用了 var 关键字,它声明的变量是全局的,包括循环体内与循环体外。
在第二个实例中,使用 let 关键字, 它声明的变量作用域只在循环体内,循环体外的变量不受影响。

局部变量
在函数体内使用var和let关键字声明的变量有点类似。
它们的作用域都是局部的:
//使用var
function myFunction(){
var carName=“Volvo”; //局部作用域
}

//使用let
function myFunction(){
let carName=“Volvo”; //局部作用域
}

全局变量:
在函数体外或代码块外使用var和let关键声明的变量也有点类似。
它们的作用域都是全局的:
//使用var
var x=2; //全局作用域
//使用let
let x=2; //全局作用域

HTML代码中使用全局变量
在JavaScript中,全局作用域是针对JavaScript环境。
在HTML中,全局作用域是针对window对象。

使用var关键字声明的全局作用域变量属于window对象。
实例:
var carName=“Volvo”;
//可以使用window.carName访问变量

使用let关键字声的全局作用域变量不属于window对象:
实例:
let carName=“Volvo”;
//不能使用window.carName访问变量

重置变量:
使用var关键字声明的变量在任何地方都可以修改:
实例:
var x = 2;
// x 为 2
var x = 3;
// 现在 x 为 3

在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量:
var x = 2; // 合法
let x = 3; // 不合法

{
var x = 4; // 合法
let x = 5 // 不合法
}

在相同的作用域或块级作用域中,不能使用let关键字来重置let关键字声明的变量:
let x = 2; // 合法
let x = 3; // 不合法

{
let x = 4; // 合法
let x = 5; // 不合法
}

在相的作用域或块级作用域中,不能使用var关键字来重置let关键字声明的变量:
let x = 2; // 合法
var x = 3; // 不合法

{
let x = 4; // 合法
var x = 5; // 不合法
}

let关键字在不同作用域,或不同块级作用域中是可以被重新声明赋值的:
let x = 2; // 合法

{
let x = 3; // 合法
}

{
let x = 4; // 合法
}

变量提升:
JavaScript中,var关键字定义的变量可以在使用后声明,也就是变量可以先使用再声明
(JavaScript变量提升)
实例:
//在这里可以使用carName变量
var carName;

let关键字定义的变量则不可以在使用后声明,也就是变量需要先声明在使用。
//在这里不可以使用carName变量
let carName;

const关键字
const用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:
实例
const PI = 3.141592653589793;
PI = 3.14; // 报错
PI = PI + 10; // 报错

const定义常量与使用let 定义的变量相似:

二者都是块级作用域
都不能和它所在作用域内的其他变量或函数拥有相同的名称
两者还有以下两点区别:

const声明的常量必须初始化,而let声明的变量不用
const 定义常量的值不能通过再赋值修改,也不能再次声明。而 let 定义的变量值可以修改。
var x=10;
//按这里输出x为10
{
const x=2;
//这里输出X为2
}
//这里输出X为10

const声明的常量必须初始化:
// 错误写法
const PI;
PI = 3.14159265359;

// 正确写法
const PI = 3.14159265359;

const并非真正的常量
const的本质:const定义的变量并非常量。
并非不可变,它定义了一个常量引用一个值。
使用 const 定义的对象或者数组,其实是可变的。下面的代码并不会报错:
实例
// 创建常量对象
const car = {type:“Fiat”, model:“500”, color:“white”};

// 修改属性:
car.color = “red”;

// 添加属性
car.owner = “Johnson”;

但是我们不能对常量对象重新赋值:
实例:const car = {type:“Fiat”, model:“500”, color:“white”};
car = {type:“Volvo”, model:“EX60”, color:“red”}; // 错误

以下实例修改常数组:
实例
// 创建常量数组
const cars = [“Saab”, “Volvo”, “BMW”];

// 修改元素
cars[0] = “Toyota”;

// 添加元素
cars.push(“Audi”);

但是我们不能对常量数组重新赋值:
const cars = [“Saab”, “Volvo”, “BMW”];
cars = [“Toyota”, “Volvo”, “Audi”]; // 错误

浏览器支持
Internet Explorer 10 及更早版本的浏览器不支持 const 关键字。

下表列出了各个浏览器支持 const 关键字的最低版本号。

Chrome 49 IE / Edge 11 Firefox 36 Safari 10 Opera 36
Mar, 2016 Oct, 2013 Feb, 2015 Sep, 2016 Mar, 2016
重置变量
使用 var 关键字声明的变量在任何地方都可以修改:

实例
var x = 2; // 合法
var x = 3; // 合法
x = 4; // 合法
在相同的作用域或块级作用域中,不能使用 const 关键字来重置 var 和 let关键字声明的变量:

var x = 2; // 合法
const x = 2; // 不合法
{
let x = 2; // 合法
const x = 2; // 不合法
}

在相同的作用域或块级作用域中,不能使用 const 关键字来重置 const 关键字声明的变量:

const x = 2; // 合法
const x = 3; // 不合法
x = 3; // 不合法
var x = 3; // 不合法
let x = 3; // 不合法

{
const x = 2; // 合法
const x = 3; // 不合法
x = 3; // 不合法
var x = 3; // 不合法
let x = 3; // 不合法
}

const 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的:

const x = 2; // 合法

{
const x = 3; // 合法
}

{
const x = 4; // 合法
}

变量提升
JavaScript var 关键字定义的变量可以在使用后声明,也就是变量可以先使用再声明(JavaScript 变量提升)。

实例
carName = “Volvo”; // 这里可以使用 carName 变量
var carName;

const关键字定义的变量则不可以在使用后声明,也就是 变量需要先声明在使用。
carname=Volvo”;
const carName=“Volvo”;

变量var:
1.可以重复声明
2.无法限制修改
3.没有块级作用域

let不能重复声明,变量可以修改,块级作用域
const 不能重复声明,变量不能修改,块级作用域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值