js中是函数声明先提升还是变量先提升

这个昵称没有被占用吧 2016-09-14 10:40:21
在 你不知道的JavaScript(上卷) 一书的第40页中写到:函数会首先被提升,然后才是变量。

console.log(foo);
function foo(){
console.log("函数声明");
}
var foo = "变量";

输出为:
function foo(){
console.log("函数声明");
}

疑问:如果函数先提升,接着变量再提升,那么变量提升后的值不是会覆盖掉函数提升吗,最后执行console.log(foo)时,不是应该输出变量吗,即undefined
...全文
1779 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaerfeng 2017-04-22
  • 打赏
  • 举报
回复 1
引用 5 楼 Bigbigwen 的回复:
var getName = function(){ console.log(2); } function getName (){ console.log(1); } getName(); 这种情况,函数和变量的声明都提升了,输出结果是2,这种情况下getName函数为什么没有覆盖getName变量呢
先理解这句话:函数会首先被提升,然后才是变量。所以你说反了。你后来的变量覆盖了你的函数。代码并不是你写的顺序那样执行的。
BigBigWen 2017-03-21
  • 打赏
  • 举报
回复
var getName = function(){ console.log(2); } function getName (){ console.log(1); } getName(); 这种情况,函数和变量的声明都提升了,输出结果是2,这种情况下getName函数为什么没有覆盖getName变量呢
saintknick 2017-02-20
  • 打赏
  • 举报
回复
在编译阶段,后面的变量声明遇到前面有冲突的变量声明或者函数声明,都会忽略。
LH6235 2016-09-14
  • 打赏
  • 举报
回复
函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖,所以你上面的代码实际上是 function foo(){ console.log("函数声明"); } var foo; console.log(foo); foo = "变量"; 在最后再加上打印就能看到函数已经被覆盖了。 注:初始化变量不会把值也提上上去,只会提升变量的声明。
scscms太阳光 2016-09-14
  • 打赏
  • 举报
回复
理解楼主的疑问。其实主要是var foo;并不会覆盖之前的变量
var foo = "function";
var foo;//它只是定义,全不会覆盖变量
console.log(foo);//返回 function
Devin.qu 2016-09-14
  • 打赏
  • 举报
回复
javascript 函数声明和变量声明会被解释器提升到最顶端,但是变量的初始化不会被提升 因为var foo = "变量"; foo被初始化了

87,915

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧