关于js的Hoisting, 这个结果为什么是这样呢

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
console.log(a); //1

为什么不是10呢, 在function b中定义了一个function a, 怎么就能把a=10给冲掉呢, 这段代码的解析和执行顺序是怎么样的啊

原文在这:
http://www.adequatelygood.com...

阅读 2.1k
3 个回答

function b() {

a = 10;
return;
function a() {}

}
//由于函数声明提升,是这样的
function b(){

function a(){}
a=10;/此时只是把b的函数作用域中的a赋值为10,并不会改变全局的变量
return 

}

    function b() {
        a = 10;
        return;
        function a() {}
    }

当这段代码执行在实际运行过程中可以分为2个阶段,第一个阶段是代码的编译阶段,在这个阶段引擎会找到所有的声明,并关联作用域,这也是hoisting发生的阶段,第二阶段是代码的执行阶段

具体到上面的代码就是:在一个函数内,通过函数表达式的方式声明了函数a: function a() {},编译阶段hoisting。那么这个函数执行的时候就成这样了:

    function b() {
        function a(){};
        a = 10;
        return;
    }

函数b执行的时候,在它的作用域中有局部变量a,因此并不会影响到外部的全局变量a,所以最后console.log(a)的时候仍然是输出的全局变量a的值.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题