js变量提升是提升到具体哪一行了?

   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),它提升到哪一行了?
阅读 2.6k
5 个回答

申明会被提升,赋值语句还是留在原地不会被提升,如果是在函数作用域会提升到函数体顶部,在全局作用域的话就是全局空间顶部,就你这里的代码,提升到第2、3行中间~

应该提升到作用域顶部吧。。而且好像只是提升声明,不提升赋值,也就是相当于:

`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控制台得到

https://segmentfault.com/a/11...
你可以看看这个,讲的很详细。
我能说的就是,看情况。还有,多谷歌,这种问题不需要提问的,随便一搜就有很多了。

JS 中if 的{ } 不存在 块级作用域的 , 因此 变量申明会被提示。 变量的 提升, 提示到 当前作用域的 顶部 , 如 函数中, 内部变量,与形参 重名 的话, 会造成 第二次以及 后面的申明 无效。

推荐问题
宣传栏