这只是一个提醒,如果你这样做:
var x=5;
var x;
alert(x);
结果将为5。
如果在其他一些语言中重新声明变量,例如,结果将为未定义(undefined)或NaN,但不适用于JavaScript。
console.log(this.name + 'makes a sound.')
。当然,在我声明它之后,我意识到“make”需要在引号和单词之间加上一个空格。所以我导航到该条目,进行了相应的修复,并重新提交,认为新的声明将覆盖先前的声明。显然,这不是javascript的工作方式。那么我该怎么处理呢? - Musixauce3000var x=5; var x=x+10; alert(x);
,结果将是15,即在第二个 var
中,第一个 var
分配的 x 的原始值是可访问的,并且可以在 RHS 表达式中使用。 - Doin 在Google Analytics中可以找到重新声明变量的示例。当Google Analytics脚本启动JavaScript跟踪代码时,它以如下方式声明或重新声明_gaq
:
var _gaq = _gaq || [];
换句话说,如果已经定义了_gaq
变量,_gaq
会被"重新声明"为其自身。如果未定义,则首次声明为空数组。_gaq
变量的代码也可以安全地检查预定义的_gaq
变量。如果存在,它知道可以使用它。如果不存在,它知道应该在尝试使用它之前定义它。为什么我需要重新声明一个变量?
你不应该这样做,它会导致代码混乱。
在某些情况下这样做很实用吗?
不是的。
var i = 0
仅在它被声明的循环内使用,那么为什么我要花心思去为第二个循环发明另一个名称呢?所以这至少是一个例子,变量重新声明是实用的,我认为。 - Dmitry Koroliovfor (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);
let
和 const
。 - Manuel它不会因为提升而失去其价值
var x = 5;
var x;
// this is same as
var x; // undefined;
x = 5;
当你说“如果重新声明JavaScript变量,它不会失去其值”时,
根据hoisting的规则,所有声明都会被提升到顶部。然后变量被赋值。
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 的回答。
请记住,只有使用var
声明的变量可以被重新声明。如果您尝试重新声明使用let
或const
声明的变量(这是现今大多数情况下应该使用的 ES2015 JavaScript 语法),情况会更糟糕,除了失去该值之外,还会抛出一个错误:
let foo = 'foo';
let foo;
let
或const
变量得到正确初始化的单一点。在此之前,变量名将存在于暂时性死区中。var
赋值语句放在其他语句之后被认为是不好的风格。使用“单变量模式”(请参见此处),重新声明只能像Steve Oliver的Google Analytics示例中那样发生。我会重构上面的示例为: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);
重新声明可能是有意义的,特别是在使用可选参数的默认值时(我想这就是Google Analytics示例的用途):
function abc(param1) {
var param1 = param1 || 'default value';
}
重新声明变量其实很简单,它并不会对任何东西产生影响,你只需要记住,如果在作用域内重新分配值,则重新分配的值仅限于该作用域内,在作用域外部仍然是全局声明的值。
var page =1 ;
function htmlcode(page) {
page = "keka";
console.log("inside " + page);
}
htmlcode(page);
console.log("inside " + page);
Output : inside keka
inside 1