我是否可以防止在TypeScript/JavaScript中意外覆盖局部变量?

我是否可以防止在TypeScript/JavaScript中意外覆盖局部变量?,javascript,typescript,local-variables,Javascript,Typescript,Local Variables,今天我花了一个小时调试一个小问题,其中名为server的局部变量正在初始化和配置-然后,在同一文件的最后一行中,它意外地被重新声明,例如,被另一个var server=…语句重新声明,有效地创建了名为server的新变量,从而导致前一个变量超出范围;然而,由于这些变量类型相同,名称相同,因此其他所有变量都继续工作,这使得调试相当困难 有没有一种类型脚本或JavaScript语言特性可以阻止这种事情发生 我的想法是,不应该允许在同一范围内声明两个同名变量 也许有一个过梁或一些质量保证工具,有能力检

今天我花了一个小时调试一个小问题,其中名为
server
的局部变量正在初始化和配置-然后,在同一文件的最后一行中,它意外地被重新声明,例如,被另一个
var server=…
语句重新声明,有效地创建了名为
server
的新变量,从而导致前一个变量超出范围;然而,由于这些变量类型相同,名称相同,因此其他所有变量都继续工作,这使得调试相当困难

有没有一种类型脚本或JavaScript语言特性可以阻止这种事情发生

我的想法是,不应该允许在同一范围内声明两个同名变量


也许有一个过梁或一些质量保证工具,有能力检查和防止这种事情?(也许还有其他“坏”模式?

尽可能使用
无处不在

let
变量在声明之前不能使用:

var x = 3;
function f() {
  console.log(x); // ReferenceError, x is not defined
  let x = 5;
}
两种选择:

  • 使用ECMA脚本6和
    let
  • var
    一起使用
  • 页面。建议以ECMA脚本6为目标,使用
    let

    ECMA脚本6带有
    let
    :

    重复声明,x

    var的JSLint
    此外,即使您没有使用严格的工具,该工具也会对此表示不满

    (function () {
    
        var x, y;
        x = "foo";
        y = "foo";
    
        function sayMsg() {
            // jslint will complain here
            var y = "bar";
        }
    
        sayMsg();
    
        // jslint will also complain here
        var x = "bar" + y;
    
    }());
    
    这将告诉你:

    第3行“y”的重新定义

    将其与前面的“var”语句相结合


    无论如何都要严格使用。另外,Jslint。从技术上讲,引起问题的不是杂散语句的
    var
    部分,而是初始化表达式。无论如何,所有
    var
    声明都会被提升到函数的顶部,因此冗余声明不是问题。它是重写变量先前值的赋值。“通过另一个var server=…语句,有效地创建了一个名为server的新变量”,而不是在JavaScript中(我不能说typescript)。在JavaScript中,如果它是同一个作用域,那么其中的
    var
    部分是完全不可操作的;它只是一个赋值表达式。@Nit:Strict模式不会将冗余声明变成错误。不幸的是。JSLint也没有警告你。@Jonathan:RobG是正确的,第二个声明被忽略了。另一方面,赋值不是。可以说使用
    let
    ,但该示例与OP的情况不太相关,因为在示例中使用
    var
    不会改变第一个
    x
    的值。我认为在OPs案例中,他指的是“变量在同一范围内”的情况,例如
    var server=。。。;var服务器=…
    (无错误)。如果改为使用
    let
    无法重新声明所需的阻塞作用域变量,这可能会导致错误。是的,正确-问题在于变量在同一作用域中。我应该发布一个代码示例+1表示接受答案,但将Shaun的答案标记为接受,因为它更完整。我认为我曾看到其他语言中以这种方式使用
    let
    ,但没有看到任何迹象表明它在JS中会以这种方式工作。好消息!谢谢:-)
    (function () {
    
        var x, y;
        x = "foo";
        y = "foo";
    
        function sayMsg() {
            // jslint will complain here
            var y = "bar";
        }
    
        sayMsg();
    
        // jslint will also complain here
        var x = "bar" + y;
    
    }());