在Typescript中var和let有什么区别?

Ala*_*an2 42 typescript

我提交了一个关于堆栈溢出的问题,询问如何阻止putTestQuestionResponses()函数执行IF以前的版本已经执行.

回复是添加一个处理标志,该标志位于此代码的第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);
}]
Run Code Online (Sandbox Code Playgroud)

Mar*_*cka 57

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

有关详细信息,请参阅https://basarat.gitbooks.io/typescript/content/docs/let.html.

  • 来自C#背景,这看起来很奇怪.变量声明是否只有一个关键字?为什么我们会有非块范围的变量?似乎没什么意义..但我刚开始学习TypeScript. (4认同)
  • `var`来自JavaScript,它是一个函数范围的声明.TypeScript没有太多选择来改变行为. (4认同)
  • 是的,`let`是首选方式.(TypeScript看起来类似于C#,但在JavaScript的上下文中推理TypeScript总是更好,因为JavaScript和.NET语言之间存在许多根本区别(原型,静态类型等)) (4认同)
  • 我知道了。我猜这是因为 TypeScript 也支持纯 JavaScript。有道理。所以你的意思是最好避免使用 var 关键字,而是使用 let 关键字,至少在尝试以与 C#、Java 等类似的风格设计代码时,其中所有变量的范围都限定在其当前范围内? (3认同)

小智 27

例:

// 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
Run Code Online (Sandbox Code Playgroud)

很容易知道


小智 18

varJavaScript中的变量是函数作用域.这与变量是块作用域的许多其他语言(C#,Java等)不同.如果你将一个块范围的思维模式带到JavaScript,你可能希望以下内容打印123,而不是它将打印456:

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

console.log(foo); // 456
Run Code Online (Sandbox Code Playgroud)

这是因为{不创建新的变量范围.fooif块内的变量与if块之外的变量相同.这是JavaScript编程中常见的错误来源.这就是TypeScript(和ES6)引入let关键字以允许您使用true块范围定义变量的原因.也就是说,如果您使用let而不是var,则会获得与您在范围外定义的内容断开的真正唯一元素.以下示例演示了相同的示例let:

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

}

console.log(foo); // 123
Run Code Online (Sandbox Code Playgroud)