重新声明一个javascript变量

时间:2011-07-31 09:05:41

标签: javascript variables declaration

this教程中写道:

If you redeclare a JavaScript variable, it will not lose its value.

我为什么要重新声明变量?在某些情况下它是否实用?

谢谢

8 个答案:

答案 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声明的变量才能被重新声明。如果您尝试重新声明用letconst声明的变量(这是当今大多数情况下应使用的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