1 var foo = 1;
2 function bar() {
3 console.log(foo);
4 if (!foo) {
5 var foo = 10;
6 }
7 console.log(foo);
8 }
9 bar();
老是听说var变量提升,到底是提升到了哪个地方?如上bar函数里的foo变量(var foo = 10),它提升到哪一行了?
1 var foo = 1;
2 function bar() {
3 console.log(foo);
4 if (!foo) {
5 var foo = 10;
6 }
7 console.log(foo);
8 }
9 bar();
老是听说var变量提升,到底是提升到了哪个地方?如上bar函数里的foo变量(var foo = 10),它提升到哪一行了?
应该提升到作用域顶部吧。。而且好像只是提升声明,不提升赋值,也就是相当于:
`var foo = 1;
function bar() {
var foo;
console.log(foo);
if (!foo) {
foo = 10;
}
console.log(foo);
}
bar();`
如果有误请指正。。。
变量提升是提升到当前作用域的顶部,你这段代码不太适合说变量提升,因为本身还有个全局作用于和局部作用域的问题。我写个单纯的变量提升的例子:
function bar(){
console.log(foo); // -> undefined
var foo = 10;
console.log(foo); // -> 10
}
从执行结果可以看出来,发生了变量提升。具体js的执行顺序:
function bar(){
var foo; //这就是变量提升了,执行的时候js会先声明foo变量,但不赋值
console.log(foo); // -> undefined,控制台输出,所以这个地方是undefined
foo = 10; //给foo赋值为10,并不是在这句代码才声明的foo变量
console.log(foo); // -> 10,foo已经在上一句赋值了,输出10
}
做个对比,
function bar(){
console.log(foo); // -> Uncaught ReferenceError: foo is not defined
}
报错了,foo变量未定义。
以上代码结果由chrome控制台得到
JS 中if 的{ } 不存在 块级作用域的 , 因此 变量申明会被提示。 变量的 提升, 提示到 当前作用域的 顶部 , 如 函数中, 内部变量,与形参 重名 的话, 会造成 第二次以及 后面的申明 无效。
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
申明会被提升,赋值语句还是留在原地不会被提升,如果是在函数作用域会提升到函数体顶部,在全局作用域的话就是全局空间顶部,就你这里的代码,提升到第2、3行中间~