javascript - 关于js的Hoisting, 这个结果为什么是这样呢
怪我咯
怪我咯 2017-04-11 11:16:29
0
3
256
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...

怪我咯
怪我咯

走同样的路,发现不同的人生

reply all (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的值.

      巴扎黑

      已解决, 谢谢大家, 还有一篇文章就是说这个的, 如下:
      https://segmentfault.com/q/10...

        Latest Downloads
        More>
        Web Effects
        Website Source Code
        Website Materials
        Front End Template
        About us Disclaimer Sitemap
        php.cn:Public welfare online PHP training,Help PHP learners grow quickly!