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
相同的作用域规则,但是不能对它们重新赋值。