在說let和const之前先簡單的說一下作用域,因為后面會有提到
ES5中的作用域有全局作用域和函數(shù)作用域壶栋,到了ES6來新增了:塊作用域
塊作用域簡單的說是:代碼中使用{}包起來的结胀,就是一個塊作用域
let
先看一個demo:
function test(){
for (let i=1;i<3;i++) {
console.log(i)
}
console.log(i)
}
結(jié)果報錯
1赞咙、i 脫離了塊作用域,let聲明的變量只有在塊作用域重用小 所以報錯
2糟港、我們沒有聲明i調(diào)用的時候應該報undefined錯誤攀操,這里報is not defined ,這是為什么呢秸抚?是因為es6默認(強制)開啟了嚴格模式“use strict”速和,如果在es5中需要開啟嚴格模式的話,在js文件的頂部加上“use strict”
嚴格模式:變量未聲明不能引用
3剥汤、let不允許在相同作用域內(nèi)颠放,重復聲明同一個變量。
// 報錯
function func() {
let a = 10;
var a = 1;
}
// 報錯
function func() {
let a = 10;
let a = 1;
}
只要塊級作用域內(nèi)存在let命令吭敢,它所聲明的變量就“綁定”(binding)這個區(qū)域碰凶,不再受外部的影響;
使用var則不會報錯省有,是因為var的變量提升的原因痒留;為了糾正這種現(xiàn)象,let命令改變了語法行為蠢沿,它所聲明的變量一定要在聲明后使用伸头,否則報錯
function test(){
for (var i=1;i<3;i++) {
console.log(i)
}
console.log(i)
}
const
const是定義常量的
function test() {
const PI = 3.1415926;
PI = 3.14;
console.log(PI)
}
報錯: SyntaxError: "" is read-only;
是因為const一旦定義不可被更改(這種說法不嚴謹,繼續(xù)看)一旦修改就會報錯: SyntaxError: "" is read-only
function test() {
const c = {
a:1
} ;
c.b = 2;
console.log(c)
}
如上圖舷蟀,為什么const定義的c 可以修改其內(nèi)部屬性的值呢恤磷?
const 聲明的引用類型可以修改面哼,const聲明的是指向?qū)ο蟮闹羔槪羔槻荒茏兊菍ο笫强梢宰兊纳ú剑籧onst定義的基本類型不能修改
function test() {
const PI ;
PI = 3.14;
console.log(PI)
}
const 聲明的同時必須賦值魔策,否則報錯: SyntaxError:Unexpected token