var name = "Hello";
function foo(){
// 实质上相当于: var name;
console.log(name); // undefind
var name = "World";
}
foo();
你说的是这个问题吗?js执行是顺序执行。但是在编译的时候,JS会把所有的var声明变量都提升到当前上下文的顶端。避免这个问题,可以考虑使用: let 来声明变量。let变量必须先声明后使用。
背景知识:
JavaScript 是由上至下解释执行的, 但 其 函数及变量的声明都将被提升到函数的最顶部。
js 变量提升: 变量可以在使用后声明,也就是变量可以先使用再声明, 但 js 初始化不会提升。
js 通过 var 语句来声明 变量:var x; 或 var carname; 在以上声明之后,变量并没有值。
js 可以在声明它们时向变量赋值:var x=5; 或 var carname="Volvo"。
js 声明变量,并赋值(初始化、设置)的时候, 变量前边可以加、亦可以不加 var。就是说,不用 var 语句,也可以做到声明变量,并给它 赋值/初始化/设置。
Js 的变量提升是针对var的,而let和const不存在变量提升这一特性。
设想,若事后声明 变量 x, 事前不用 var 语句,就为其赋值,那不就是赋值的时候,“声明并初始化” x 了吗? 事实上不就是 var x 变量提升了吗? 用 var 语句声明变量 x 但不赋值,其作用只能是规定了这个变量 x 的作用域。
下列案例说明 js 是如何“提升”变量。
js 声明变量,并赋值(初始化、设置)的时候, 变量前边可以加、亦可以不加 var。就是说,不用 var 语句,也可以做到声明变量,并给它 赋值/初始化/设置。
接下来,在输出 x 值之后,再声明 变量 x, 即添加代码行 var x。如果没有对 x 赋值,其值仍旧保留声明之前的样子。这不就是 var x 变量提升的案例吗?[案例如下]
s='';
x=11;
s +='没有加 var, 直接给 x 赋值。结果 x: ' + x;
var x;
s += '。<br>后来, 仅仅声明了变量 x,';
s += ' 并未对其从新赋值,变量 x 则保留原来的数值。' ;
s += ', x: ' + x;
document.write(s);
输出:
没有加 var, 直接给 x 赋值。结果 x: 11。
后来, 仅仅声明了变量 x, 并未对其从新赋值,变量 x 则保留原来的数值。, x: 11
参考:
js的变量提升是什么意思?js变量提升使用介绍(实例)