Javascript JS中的非唯一变量名
反复使用变量名有效吗?例如:Javascript JS中的非唯一变量名,javascript,Javascript,反复使用变量名有效吗?例如: function clicks() { var foo = document.getElementById("cat"); foo.click(); var foo = document.getElementById("dog"); foo.click(); // Again! This works, but may be it is not valid? } function bar () { if (true) {
function clicks() {
var foo = document.getElementById("cat");
foo.click();
var foo = document.getElementById("dog");
foo.click(); // Again! This works, but may be it is not valid?
}
function bar () {
if (true) {
let foo = 5
}
console.log(foo) // not defined
// you would need to declare foo again with `let foo = ...`
}
或者我应该使用唯一的变量名,如下所示
function clicks() {
var foo1 = document.getElementById("cat");
foo1.click();
var foo2 = document.getElementById("dog");
foo2.click();
}
是的,它是有效的。这是因为解释器“提升”变量声明。也就是说,它将声明移动到当前函数范围的顶部 对于解释器,您的代码“看起来”如下:
function clicks () {
var foo;
foo = /* something */
foo = /* something */
}
现在,如果不希望出现这种行为,可以使用保持当前范围的let
。例如:
function clicks() {
var foo = document.getElementById("cat");
foo.click();
var foo = document.getElementById("dog");
foo.click(); // Again! This works, but may be it is not valid?
}
function bar () {
if (true) {
let foo = 5
}
console.log(foo) // not defined
// you would need to declare foo again with `let foo = ...`
}
覆盖变量的值没有什么错。请注意,这可能会使应用程序的行为更加混乱,例如,如果有人在阅读您的代码时没有注意到您重新声明变量的位置。请注意,声明一次之后,只需执行
foo=document.getElementById(“dog”)代码>而不是var foo=document.getElementById(“dog”)
您不能在js中重新实例化变量,因此var foo
两次都不应该工作:/
解决办法是使用这样的东西
function clicks() {
var foo = document.getElementById("cat");
foo.click();
//remove var in this line...
foo = document.getElementById("dog");
foo.click(); // Again! This works, but may be it is not valid?
}
从技术上讲,可以使用多个同名变量,但它们都将共享同一实体。它将只是该名称下的一个变量
但实际上你应该避免这种情况。注意:let
是一种新语法,并不是所有正在使用的浏览器都支持它。它工作正常。第二个声明var foo
被忽略,它只是成为foo
的赋值,变量没有“实例化”;他们被宣布了。我被这个答案弄糊涂了。它们不是“共享同一实体的同名多变量”,不管这意味着什么。它是一个变量,出现在两个var
语句中。他不是说覆盖变量的值。他说的是重新定义它,这是完全不同的。但没有重新定义变量的事情,既然变量声明被提升到了作用域的顶部,为什么会让行为变得更加混乱呢?@royhowie我说这可能会让行为变得更加混乱,因为如果有人只看到初始声明而没有覆盖,他们可能会认为“cat”被再次点击而不是“dog”。@TAGraves但这与此有什么关系呢var foo=…
vs.foo=…
?我建议你收紧你的问题。你想要解决的问题是什么?为什么不在两件不同的事情上使用两个变量呢?你担心更多的变量代价会更高?“valid”是什么意思?语法上有效,jshint有效,还是概念上有效?在任何情况下,如果您确实决定“重用”一个变量,您不需要再次声明它——第二个声明将被忽略。