javascript - 关于js的Hoisting, 这个结果为什么是这样呢
怪我咯
怪我咯 2017-04-11 11:16:29
[JavaScript讨论组]
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)
大家讲道理

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的值.

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号