为了账号安全,请及时绑定邮箱和手机立即绑定

请问这道js题是怎么一回事?

请问这道js题是怎么一回事?

祈祷者 2017-06-18 10:19:11
fn();var fn = function(){     console.log(1) }function fn(){     console.log(2)} fn();
查看完整描述

3 回答

已采纳
?
慕工程8172328

TA贡献1条经验 获得超6个赞

打印结果输出先2后1。这样的,这道题涉及到了变量提升和函数声明前置的问题。首先给你普及一下,该题定义的两个函数,乍看之下名字都叫fn,但是还是能对他们进行区分的。上面的那个函数叫做函数表达式,下面的叫函数声明。js中涉及到定义变量和函数声明都会前置到作用域的顶部。因此这道题换成javascript解析的话大概长成这样:

function fn(){    //函数声明提前

     console.log(2)

} ;

var fn;    //变量提升

fn();

fn = function(){    //赋值留在原地赋

     console.log(1) 

};

fn();

所以打印结果会变成先2后1。 (^_^)!



查看完整回答
6 反对 回复 2017-06-18
  • ExiaGo
    ExiaGo
    你好,变量提升和函数声明提前,究竟是哪个在先?个人认为是函数声明在前。
  • 慕工程8172328
    慕工程8172328
    嗯是的,查了一下在“你不知道的JavaScript(上卷)” 一书的第40页中写到:函数会首先被提升,然后才是变量。而且fn覆盖是在赋值的时候产生的,也就是说var fn;这里不会影响提前的函数。所以,在暂时不影响本题结果的情况下容我修改一下 。哈哈
  • ExiaGo
    ExiaGo
    嗯,谢啦。
?
Ni14

TA贡献9条经验 获得超4个赞

第二个以函数表达式形式声明的fn函数会提升到当前环境作用域的最顶端

实际上程序是按这种顺序执行的:

var fn;
function fn(){
   console.log(2)
} 
fn();        //这里会输出2
fn = function(){
   console.log(1)  //这里将fn变量重新赋值  覆盖了上面的
}

fn();    //这里输出1

题主可以去看一下  变量提升  的相关知识

查看完整回答
2 反对 回复 2017-06-18
?
后知后觉88

TA贡献39条经验 获得超10个赞

感觉是声明前置的顺序的问题 .  js会对函数的声明前置.

查看完整回答
反对 回复 2017-06-18
  • 3 回答
  • 0 关注
  • 1896 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信