Typescript 中 var 和 let 有什么区别?

问题描述 投票:0回答:5

我提交了一个有关堆栈溢出的问题,询问如何在先前版本已经执行的情况下阻止 putTestQuestionResponses() 函数执行。

答案是添加一个处理标志,该标志位于此代码的第 2 行。

你能告诉我为什么在这里使用“let”而不是“var”吗?

var promisePutTestQuestion;
let processing = false;

onEnter: ['$interval', 'questionService',
         ($interval, qus: IQuestionService) => {
  promisePutTestQuestion = $interval(() => {
     if (processing)
         return;
     processing = true;
     qus.putTestQuestionResponses()
     .then(() => processing = false)
  }, 5 * 1000);
}],
onExit: ['$interval', ($interval) => {
        $interval.cancel(promisePutTestQuestion);
}]
typescript
5个回答
91
投票

var
声明是函数作用域,
let
声明是块作用域。

请参阅 https://basarat.gitbook.io/typescript/future-javascript/let 了解更多详情。


42
投票

示例:

// demo: var
for(var i =0; i<5; i++){
   console.log(i) 
}//finally i =5
console.log(i) // i=5

// demo: let 
for(let i = 0; i<5; i++){
   console.log(i)
}
console.log(i)// i is undefined

40
投票
JavaScript 中的

var
变量是函数作用域的。这与许多其他语言(C#、Java 等)不同,其中变量是块作用域的。如果您将块作用域思维方式引入 JavaScript,您可能会期望以下内容打印 123,而不是打印 456:

var foo = 123;
if (true) {
    var foo = 456;
}

console.log(foo); // 456

这是因为

{
不会创建新的变量作用域。变量
foo
在 if 块内部与在 if 块外部是相同的。这是 JavaScript 编程中常见的错误来源。这就是为什么 TypeScript(和 ES6)引入了
let
关键字来允许您定义具有真正块作用域的变量。也就是说,如果您使用
let
而不是
var
,您将获得一个真正的唯一元素,与您在范围之外定义的内容无关。使用
let
演示了相同的示例:

let foo = 123;
if (true) {
    let foo = 456;

}

console.log(foo); // 123

4
投票
function varTest() {
  var x = 1;
  if (true) {
    var x = 2;  // same variable!
    console.log(x);  // 2
  }
  console.log(x);  // 2
}

function letTest() {
  let x = 1;
  if (true) {
    let x = 2;  // different variable
    console.log(x);  // 2
  }
  console.log(x);  // 1
}

我在这里找到了这个

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let


4
投票

一切都与可访问性有关。如果您使用

let
,则只能在该范围内访问它,而不能在
function
if
else
范围之外访问。但是
var
我们可以在
for
if
else
之外访问。

见下面代码

public selectedLocation(country)
  {  
     if(instance==this.list[0])
    {
      var obj=this.productArray
    }
    
    for(let i = 0; i < this.obj.length; i++)
    {
       obj=this.productPending
    }
  }

上面的代码适用于

var obj
,但这不适用于
let obj
for loop

© www.soinside.com 2019 - 2024. All rights reserved.