(1)ES6中新增的let關鍵字
以前咱們聲明一個變量時,都是使用關鍵字var,那新增長的let和var有什麼不一樣呢?
var的不足之處一:
var arr=[];
for (var i=0;i<10;i++){
arr[i]=function(){
console.log(i);
};
}
arr[8](); // console.log(i); 的結果爲 10
一樣的換成 let以後就沒問題:
var arr=[];
for (let i=0;i<10;i++){
arr[i]=function(){
console.log(i);
};
}
arr[8](); // console.log(i); 的結果爲 8
這是因爲,原本的js是沒有塊級做用域的,用var定義i時,雖然在for循環中定義,但在執行時,依然會被提高。當執行arr[8]()時,循環已經完成,這時的i=10;因此再去執行 arr[8]()時,console.log(i),i=10;
而是用let定義i,i就只能存在與for循環的塊級做用域,不會被提高。
(塊,只的是 一組{}之間的部分。)
var的不足之處二:
也就是變量提高。var 會被提高定義;let不會。
var a=1;
(function(){
alert(a);
var a=2;
})(); //undefined 表示只聲明,爲賦值;
一樣的換作let以後:
var a=1;
(function(){
alert(a);
let a=2;
})(); //報錯: Uncaught ReferenceError: a is not defined(…)
這是由於,用let定義後,變量a的定義不會被提高。且在塊級做用域內封閉,不會受到外界a的影響。在使用a(alert(a))時,a還沒有定義,因此報錯。所以,在使用let時,必定注意,變量要先聲明後使用。
使用let時注意:
注意一: 在同一塊級做用域下,不能重複聲明同一個變量。
{
var a=1;
let a=2;
} //報錯
{
let a=1;
let a=2;
} //報錯
注意二:在函數內,不能用let從新聲明函數的參數。
function say(word){
let word='hello';
alert(word);
}
say('hi'); //報錯
(2)ES6中新增的const關鍵字
const是常量(contsant)的縮寫,與let相比,const專門用來聲明一個常量。
特色:
const name='a';
name='b'; //報錯
if(1){
const name='a';
}
alert(name); //報錯
if(1){
alert(name); //報錯
var name='a';
const name='b'; //報錯
const name; //報錯
注意:當常量爲一個對象時:
const Person={'name':'a'};
Person.name='b';
Person.age='13';
console.log(Person) // {'name':b,'age':'13'}; 輸出正常。
這是因爲const聲明瞭一個引用類型的常量,使用的是傳址賦值。也就是不修改地址,只修改地址中的值。
———————————————————————
參考公衆號 :web前端教程