在JavaScript中有三種聲明變量的方式:var、let、const。
1.const 聲明創建一個只讀的常量。這不意味着常量指向的值不可變,而是變量標識符的值只能賦值一次,必須初始化。
const b = 2;
//正確
// const b;//錯誤,必須初始化
console.log(
'函數外const定義b:'
+ b);
//有輸出值
// b = 5;
// console.log('函數外修改const定義b:' + b);//無法輸出
2.var 語句用於聲明變量。
var a; //undefined (如果不初始化,輸出undefined)
var a=666; //放到方法外面為全局變量
function fun(){
//var a=555; //放到方法內部為局部變量,只能在fun()內部讀取
console.log(a); //666
}
如果不實用var 關鍵詞,無論放到方法內還是方法外都是全局變量,所以var 會影響變量作用域。
3.let是塊級作用域,函數內部使用let定義后,對函數外部無影響。
ES6新增了
let
命令,用來聲明變量。它的用法類似於
var
,但是所聲明的變量,只在
let
命令所在的代碼塊內有效。即聲明一個局部變量。
以for循環為例:
下面的代碼如果使用
var
,最后輸出的是
10
。
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
上面代碼中,變量i
是var
聲明的,在全局范圍內都有效。所以每一次循環,新的i
值都會覆蓋舊值,導致最后輸出的是最后一輪的i
的值。(常見於閉包的考察)
如果使用let
,聲明的變量僅在塊級作用域內有效,最后輸出的是6。
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
上面代碼中,變量i
是let
聲明的,當前的i
只在本輪循環有效,所以每一次循環的i
其實都是一個新的變量,所以最后輸出的是6
。