关于js预编译的问题

var fn= function() {
       console.log('hello world');
}
fn(); 
function fn() {
       console.log('hello');
}
fn()

两次都输出hello world
我自己的理解在预编译阶段,先开辟出一块内存对函数表达式保存var fn=undefined,另一块内存保存函数声明,直接定义var fn =function{...},所以后定义的函数声明不会覆盖前面的函数表达式吗,还是说这两者预编译阶段有所不同?执行阶段第一个fn由于函数表达式被赋值所以输出hello world,第二个fn为什么也是hello world?

阅读 2.5k
3 个回答

兄弟,函数声明提前啊 ..

常见的变量声明提前,同时函数声明也会提前,但是这两个提前方式并不一样,变量声明只是声明提前,而函数提前会将整个函数全部提前,即函数运行相当于

var fn = undefined; // 这两者的前后顺序大致如此
function fn() {
       console.log('hello');
}
fn= function() {
       console.log('hello world');
}
fn(); 
fn();

代码执行之前:VO中储存的fn是函数的声明,你的var fn = .....在此阶段不会覆盖。你可以在最代码最上面添加console.log(fn):结果是函数。代码执行时:fn重新赋值,所以你的2个fn的调用都会显示重新赋值后的结果,这点你可以在你的代码最上面添加fn(),结果hello

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题