let命令
let作用是聲明變量,經常使用在for循環里,聲明i
//let聲明的變量,只在代碼塊里有效
{
let a=20;
var b=99;
console.log(a)
}
console.log(b)
console.log(a) //a is not defined
let的特點
1.不存在變量提升
var 在聲明變量 c 之前,c 已經存在了只是值為undefined;而 let 沒有變量提升這種現象。
2.“暫時性死區”(TDZ):代碼塊內,使用 let 命令聲明變量前,該變量都是不可用的。
ES6明確規定,如果區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會報錯。
ES6 規定暫時性死區和let、const語句不出現變量提升
暫時性死區的本質就是,只要一進入當前作用域,所要使用的變量就已經存在了,但是不可獲取,只有等到聲明變量的那一行代碼出現,才可以獲取和使用該變量。
3.不允許重復聲明變量
function a(x){
let x //Uncaught SyntaxError: Identifier 'x' has already been declared
}
function b(x) {
{
let x // 不報錯
}
}
4.let 提供了一種塊級作用域
ES5 只有全局作用域和函數作用域,ES6新增了塊級作用域。
ES6 允許塊級作用域的任意嵌套。
內層作用域可以定義外層作用域的同名變量。
塊級作用域的出現,實際上使得獲得廣泛應用的立即執行函數表達式(IIFE)不再必要了。
{{{{{{{{let age=90;console.log(age)}}}}}}}} //90
{{{{{{{{{let age=90}console.log(age)}}}}}}}}
//Uncaught ReferenceError: age is not defined 塊級作用域
// 以前的IIFE
(function(){
temp=333;
})()
console.log(temp) //333
//現在使用let可以這樣寫
{
let temp=333
}
const
const聲明常量,一旦聲明,必須立即賦值,并且值不能改變。
const num; //Uncaught SyntaxError: Missing initializer in const declaration
const num=22;
num=334; //Uncaught TypeError: Assignment to constant variable.
const的作用域與let命令相同:只在聲明所在的塊級作用域內有效。
const命令聲明的常量也是不提升,同樣存在暫時性死區,只能在聲明的位置后面使用。
const聲明的常量,也與let一樣不可重復聲明。
注意:const變量值不能改變的原因:指向的內存地址不能改變。
ES5 聲明變量的方法(2種):var命令和function命令。
ES6 聲明變量的方法(6種):var命令、function命令、let命令、const命令,import命令和class命令。
頂層對象屬性和全局變量
var命令和function命令聲明的全局變量,依舊是頂層對象的屬性;另一方面規定,let命令、const命令、class命令聲明的全局變量,不屬于頂層對象的屬性。
var num1=12;
console.log(window.num1) //12
let num2=16;
console.log(window.num2) //undefined