JavaScript 有名/匿名函数声明的竞争
黄舟
黄舟 2017-04-11 11:13:33
[JavaScript讨论组]

看到 阮一峰老师的JS书
有个例子没看懂:

1  var f = function() {
2    console.log ('1');
3  }
4 
5  function f() {
6    console.log('2');
7  }
8 
9  f()

output: 1

chrome测试后的确输出了 1

JS解释器在扫描这个作用域时,提升了哪些声明?如何提升的?

Line 1 var f
这个变量声明肯定是提升了

Line 1 function()
这个匿名函数的声明会提升吗?

Line 5 function f()
这个函数声明是不是类似于 var f = function() {...} ?
如果是,第二次声明变量 f 应该是被忽略了
所以会变成 f = function() {...} 咯?
那为什么会忽略第二次函数声明对变量的赋值呢?

按照这篇 博客
“对于函数声明,Javascript 依然会进行变量声明提升,而且会给其赋一个初始的值。... 这个初始值其实是最后一次声明的那个函数。”

岂不是应该忽略第一个声明,输出 2 才对嘛。。

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
黄舟
  var f;
  function f(){
    console.log('2');
  }      
  f= function(){
    console.log(1);
  }
  f()

这样写应该就比较好解释为什么是1了,变量和函数声明都提升了。

巴扎黑

简单的说,变量声明与函数声明会提升至作用域代码执行前。
其中,变量声明是指var f部分,函数声明是指function f(){ ... }整个部分。
最后,f=...部分是赋值而不是声明。

提升的结果就是同 @tryzf 提供的答案(这里就不再重复了),两个声明部分被提升至代码作用域的最前端,代码中就只剩下赋值的那一段了。

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

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