我是否可以防止在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;
}());