1.Var 聲明變量
a)存在變量提升
(function(){ var a = "1"; var f = function(){}; var b = "2"; var c = "3"; })();
相當於:
(function(){ var a,f,b,c; a = "1"; f = function(){}; b = "2"; c = "3"; })();
b)聲明多個重復變量,后者覆蓋前者
var a = 10; var a = 20; var a = 30; console.log(a) //30
c)var
聲明可以在包含它的函數,模塊,命名空間或全局作用域內部任何位置被訪問
function f(shouldInitialize) { if (shouldInitialize) { var x = 10; } return x; } f(true); // 10 f(false); // undefined
d)作用域問題
function sumMatrix(matrix: number[][]) { var sum = 0; for (var i = 0; i < matrix.length; i++) { var currentRow = matrix[i]; for (var i = 0; i < currentRow.length; i++) { sum += currentRow[i]; } } return sum; } console.log(sumMatrix([[1,2,3],[10,2,3]])) //無論第二個數組怎么改變,結果始終為6
e)怪異的變量獲取
for (var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 100 * i); } //期望輸出結果:0-9 //實際輸出結果:10個10
解決方式:
for (var i = 0; i < 10; i++) { (function(i) { setTimeout(function() { console.log(i); }, 100 * i); })(i); }
for (let i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i); }
2.let變量聲明
a)當用let
聲明一個變量,它使用的是詞法作用域或塊作用域,在包含它們的塊或for
循環之外是不能訪問的。
function f(input: boolean) { let a = 100; if (input) { // Still okay to reference 'a' let b = a + 1; return b; } // Error: 'b' doesn't exist here return b; }
b)不能在 let
語句之前訪問它們
a++; // illegal to use 'a' before it's declared; let a;
c)同時多次聲明同一個變量報錯
let x = 10; let x = 20; // 錯誤,不能在1個作用域里多次聲明`x`
3.const變量聲明
與 let
相同的作用域規則,但是不能對它們重新賦值。