現在es6的**寫法越來越普及了,但具體在使用的過程中不有一些疑問,乙個具體的細節。就是let和const的區別使用。
es6 新增了兩個宣告兩個宣告識別符號的方式: let 和 const。
其實我個人是沒有其他語言基礎的,第一次看到這兩個定義,瞬間懵逼有沒有。**塊是什麼鬼? 物理指標還能勉強理解。
console.log(a) // 報錯 a is not defined
也就是說 你只需要用 {} 包起來,這個 {} 就是乙個**塊。好,接下來介紹下 let 的特性,使用 let 宣告的變數,只能在當前**塊中訪問和使用,有些類似於函式作用域,但是它又有幾點不同的地方。
function
fn1()
fn1();
// 報錯
var b = 2;
function
fn2()
fn2();
// 報錯
// 在es5 中如果想使用for迴圈每次的i需要使用閉包的特性
var arr = ;
for(var i=0; i<5; i++))
}arr[1]() // 5
arr[2]() // 5
arr[3]() // 5
arr[4]() // 5
/* 為什麼每次都是5,因為for迴圈每次做的事只是向陣列中存入乙個函式,這個函式的功能是 列印 i,但是函式並沒有立刻執行。而這個i是通過var i 這句話來宣告的。當for迴圈跑完,咱們都知道此時 i 的值是5。所以當你去執行函式的時候,自然列印出5.
*/
如果想使用每次迴圈中的i的值 可以利用es5的閉包:
var arr = ;
for(var i=0; i<5; i++)
})(i))
}arr[1]() // 1
arr[2]() // 2
arr[3]() // 3
// 以上寫法等價於下面這種寫法,注意引數i和形參i,此i非彼i
/* for(var i=0; i<5; i++))
})(i)
}*/
如果使用es6提供的let來宣告變數,那麼就會變得so easy
var arr = ; // let arr = 都可以
for(let i=0; i<5; i++))
}arr[0]() // 0
arr[1]() // 1
arr[2]() // 2
一些朋友可能會覺得特別不適應。為什麼這樣就能彈出 0, 1, 2?其實需要注意個問題,就是這個let i = 0; 宣告的位置,是在 for的() 內,那麼你可以理解成,在 for 的內部 就定義了乙個 i 而且是使用 let 定義的。所以每次迴圈就相當於在當前迴圈的i值的前提下向陣列push的。
let i;
for(i = 0; i < 5; i++),1000)
}
不同於:
for(let i = 0; i < 5; i++),1000)
}
const 除了不能改變物理指標的特性,其他特性和 let 一樣。
當宣告普通資料型別的時候,那麼一但宣告了,就不可以再改變。
const a = 1;
a = 2; //uncaught typeerror: assignment to constant variable.
當宣告複雜資料型別的時候,物理指標不可以改變,但是可以改變資料內的屬性值,以及可以給資料新增新屬性等操作。
const o = ;
o.a = 2;
o.b = 3;
console.log(o);
o = {}; // 報錯
最後還有乙個值得注意的問題:在es6中不存在函式提公升,算是修復了es5得乙個bug看個例子:
// es5
function
a()function
fn()
}}fn(); // 無理由報錯 找不到a,個人認為很不合理!
// es6
"use strict"
function
a()function
fn()
}}fn();
ES6的let與const命令
1.塊級作用域 乙個大括號 所包起來的內容就是乙個塊級作用域 let和const就是塊級作用域,2.嚴格模式 use strict 3.如果在同乙個塊級作用域中,let乙個變數不能重複使用,每乙個變數名只能被let一次,const也是這樣的。4.const定義的是乙個常量,這個常量不能被修改,但是如...
ES6新增的let與const
宣告常量,一旦宣告必須立馬賦值,否則報錯 const pi 3.14 const pi 報錯 uncaught syntaxerror missing initializer in const declaration 常量賦值以後,不能改變,否則同樣報錯 const pi 3.14 pi 3 報錯 ...
(ES6學習總結)let與const命令
let的特點大致總結有以下四點 1.只在命令的 塊內有效,即作用域只在塊級或子塊中有效 如 for let i 0 i 10 i uncaught syntaxerror identifier a has already been declared function foo args identif...