在this教程中写道:
If you redeclare a JavaScript variable, it will not lose its value.
我为什么要重新声明变量?在某些情况下它是否实用?
谢谢
答案 0 :(得分:50)
这只不过是一个提醒,如果你这样做:
var x=5;
var x;
alert(x);
结果为5。
如果你在某些其他语言中重新声明变量,例如 - 结果将是未定义的,或NaN,但不是在javascript中。
答案 1 :(得分:38)
可以在Google Analytics中找到重新声明变量的示例。当Google Analytics跟踪代码由Google Analytics脚本启动时,它会以这种方式声明或重新声明_gaq
:
var _gaq = _gaq || [];
换句话说,如果已定义_gaq
,则_gaq
将被“重新声明”为其自身。如果没有定义,它将首次声明为空数组。
这允许Google Analytics跟踪代码支持在Google Analytics代码启动之前可能需要使用该变量的其他脚本。正如@xralf指出的那样,JavaScript允许这样做。
在无法知道变量是否已被定义的情况下,重新声明变量非常有用。
通过有条件地重新声明变量,正如Google Analytics跟踪代码所做的那样,它允许变量安全地来自多个地方。
在此示例中,使用_gaq
变量的其他代码同样可以检查预定义的_gaq
变量。如果它存在,它知道它可以使用它。如果它不存在,它知道它应该在尝试使用它之前定义它。
答案 2 :(得分:19)
我为什么要重新声明变量?
你不应该。它会使代码混淆。
在某些情况下是否实用?
没有
答案 3 :(得分:7)
在javascript中没有块范围,因此建议重新声明变量以便澄清;这样可以获得更好的代码。
例如:
for (var x=0; x< 100; x++) { }
alert(x); //In most languages, x would be out of scope here.
//In javascript, x is still in scope.
//redeclaring a variable helps with clarification:
var x = "hello";
alert(x);
答案 4 :(得分:3)
由于 Hoisting
,它并没有失去它的价值var x = 5;
var x;
// this is same as
var x; // undefined;
x = 5;
所以当你说&#34;如果你重新声明一个JavaScript变量,它就不会失去它的价值。&#34;
根据吊装,所有这些声明都移到了顶部。 然后分配变量。
var x = 25;
var x; // redeclare first time
var x; // redeclare second time
// is same as
var x; // undefined
var x; // Not sure if this happens, but doesn't make a difference, it's still undefined
x = 25;
至于实用性,有时会发生。看看@steveoliver的回答。
答案 5 :(得分:1)
请记住,只有用var
声明的变量才能被重新声明。如果您尝试重新声明用let
或const
声明的变量(这是当今大多数情况下应使用的ES2015 Javascript语法),甚至比丢失值更糟,错误将被抛出:
let foo = 'foo';
let foo;
因此,在使用现代Javascript语法的代码库中,根本无法重新声明变量-解释器需要能够在代码中标识单点,之后{ 1}}或let
变量已正确初始化。在此之前,变量名称将存在于temporal dead zone中。
答案 6 :(得分:0)
一般情况下,由于提升问题(see here),在其他语句之后进行var
分配可能会被视为不良风格。使用“单一变量模式”(see here),重新声明只能像Steve Oliver的Google Analtyics示例中那样进行。我将上面的例子重构为:
var x, max = 100; // no further var declarations afterwards!
for (x = 0; x < max; x++) { }
alert(x);
// redeclaration 'var x = "hello"' doesn't make any sense here
// and would be complained about by JSLint/-Hint
x = 'hello';
alert(x);
重新声明可能有意义但是当使用可选参数的默认值时(我假设是谷歌分析示例):
function abc(param1) {
var param1 = param1 || 'default value';
}
答案 7 :(得分:0)
很简单,重新声明实际上并没有任何影响,您只需要记住,如果您在范围内重新分配值,则重新分配的值将限制在范围内,而在范围之外,它将仍然是全局声明的值>
Register.js