var、let和const
阿新 • • 發佈:2018-12-06
宣告提前:
JS程式在正式執行前,會將所有的var宣告的變數和function宣告的函式,預讀到所在作用域的頂部,但是對變數的賦值還留在原來的位置。
var和let區別
var用於宣告變數,存在"變數提升現象",即變數可以在宣告之前使用,值為undefined。
let也是用於宣告變數,其用法類似於var,但是所宣告的變數只在let命令所在程式碼塊中有效。let不存在變數提升,未宣告的變數不能賦值,否則會報錯
//var
console.log(a);//undefined
var a=10;
//let
console.log(b);//Uncaught ReferenceError: b is not defined
let b=20;
let存在暫時性死區,暫時性死區的本質就是,只要進入當前作用域,所要使用的變數就已經存在,但是不可獲取,只有等到宣告的哪一行程式碼出現,才可以獲取該變數。
var num=1;
if(true){
num=2;//Uncaught ReferenceError: num is not defined
let num;
console.log(num);//undefined
num=3;
console.log(num);//3
}
var x=x;//不會報錯
let x=x;//報錯
let不允許在相同作用域內宣告同一變數。
//Uncaught SyntaxError: Identifier 'a' has already been declared
(function(){
let a=1;
var a=2;
console.log(a);
})()
//Uncaught SyntaxError: Identifier 'a' has already been declared
(function(){
let a=1;
let a=2;
console.log(a);
}())
//Uncaught ReferenceError: arg is not defined
function(){
let arg;
consoel.log(arg);
}(arg))
let可以為JavaScript實現塊級作用域
function f1(){
let n=5;
if(true){
let n=10;
}
console.log(n);//5
}
const用來宣告一個常量。一旦宣告,常量的值就不能改變。而且const一旦宣告常量,就必須立即初始化,不能留到以後賦值。
const PI=3.14;
PI=3;//Uncaught TypeError: Assignment to constant variable.
const foo;//Uncaught SyntaxError: Missing initializer in const declaration
const的作用域與let相同:只在宣告所在的塊級作用域內有效。
const命令宣告的常量也不會提升,同樣存在暫時性死區,只能在聲明後使用。同樣也不能重複宣告。