老师 为什么第一个不是输出undefined,是哪里理解错了

老师 为什么第一个不是输出undefined,是哪里理解错了

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

</head>

<body>

<script>

console.log(a);//function a(){console.log(4);}

var a=1;

console.log(a);//1

function a(){

console.log(2);

}

console.log(a);//1

var a=3;

console.log(a);//3

function a(){

console.log(4);

}

console.log(a);//3

a();//报错

// 预解析后

// function a(){

// console.log(2);

// }

// function a(){

// console.log(4);

// }

// var a=undefined;

// console.log(a);//undefined

// var a=1;

// console.log(a);//1

// console.log(a);//1

// var a=3;

// console.log(a);//3

// console.log(a);//3

// a();//此时a已经被3赋值,不是一个函数,所以调用会报错

</script>

</body>

</html>


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,预解析后a的值为function  () {console.log(4) } , 所以第一次输出a的值应该为function a() {console.log(4)},其他的理解是对的,结合下图注释理解:

http://img1.sycdn.imooc.com//climg/6057f4a5091b7d8307520435.jpg

祝学习愉快~

  • lcy_18 提问者 #1

    所以预解析后是这样吗?

    // 预解析后

    function a(){

    console.log(2);

    }

    function a(){

    console.log(4);

    }

    var a=function a(){

    console.log(4);

    };

    console.log(a);//function a(){console.log(4);}

    var a=1;

    console.log(a);//1

    console.log(a);//1

    var a=3;

    console.log(a);//3

    console.log(a);//3

    a();//此时a已经被3赋值,不是一个函数,所以调用会报错


    2021-03-22 12:43:48
  • 好帮手慕慕子 回复 提问者 lcy_18 #2

    同学你好,是的,可以这样理解,祝学习愉快~

    2021-03-22 13:36:55
好帮手慕慕子 2021-03-21 13:47:06

同学你好,这是因为函数和变量在代码执行之前都会预解析,当函数名和变量同名时,会优先提升函数,本题代码中 function a() { console.log(4)}是最后一个函数,预解析时,它会把前面的给覆盖。通俗的理解为,预解析阶段结束后 ,a最终为function a() { console.log(4)}。

预解析阶段结束之后,会进入执行代码阶段,执行的第一句代码就是输出a。此时a是一个函数,输出函数名就是输出这个函数整体,所以会输出function a() { console.log(4)}

祝学习愉快~

  • 提问者 lcy_18 #1

    那我这个预解析后的代码有什么问题吗?

    2021-03-21 23:14:47
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师