一道javascript 题目
迷茫
迷茫 2017-04-10 14:29:22
[JavaScript讨论组]
    var foo = 1;
    function bar() {
      foo = 10;
      return;
      function foo() {}
    }
    bar();
    console.log(foo); //为什么是1而不是10

一个类似的题目
http://segmentfault.com/q/1010000000600770

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(4)
巴扎黑
    var foo = 1;
    function bar() {
      foo = 10;
      return;
      function foo() {}
    }
    bar();
    console.log(foo); //为什么是1而不是10

先分析一下每步流程:
第一步:var foo = 1;
全局变量foo被初始化赋值成1。
第二步:执行bar();方法。
第三步:bar()方法里,函数声明function foo(){}优先处理,这里JavaScript解析语法时(在运行之前)函数优先于一切。所以foo被初始化赋值为function(){};
第四步:执行foo = 10;这里制造了一个假象,认为没有用var 声明指向的是外层foo = 1;。其实不是。而是先在自身函数体里找有没有foo声明,找到之前声明的function foo(){};赋值成10,只是局部变量的值改写。
第五步:输出foo,这时找的是全局变量var foo = 1;输出1。

高洛峰

貌似在js中会先处理变量的声明~~

所以运行到bar内部时,js会先调用foo的声明。

 function bar() {
      foo = 10;//再运行这一行
      return;
      function foo() {};//先运行这一行
    }

等于说在bar中,foo其实指向的是function foo(){},而不是外面的foo

考试题有点扯淡,如果在生产中谁写出这样的代码肯定要拿回去重写的。

大家讲道理

bar 方法是函数声明 会在执行前被 解析(hoisted), 存在于当前上下文的任意一个地方


var foo = 1; function bar() { foo = 10; #在此之前 由于下边的函数声明 已经存在一个名为 foo return; #的局部变量 function foo() {} } bar(); console.log(foo);
伊谢尔伦

Hoisting

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

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