TS学习之变量声明

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

原文地址:https://www.cnblogs.com/sghy/p/7724175.html