1. 程式人生 > >var、let和const

var、let和const

宣告提前:
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命令宣告的常量也不會提升,同樣存在暫時性死區,只能在聲明後使用。同樣也不能重複宣告。