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

看《你不知道的javascript》,自己试验了一下书中一段代码,和书中讲解的不一样

看《你不知道的javascript》,自己试验了一下书中一段代码,和书中讲解的不一样

杨__羊羊 2018-09-10 12:10:44
fun(); //报错TypeErrorvar a=true;if(a){     function fun() {         console.log("1");     } }else{     function fun() {         console.log("2");     } }按书中的说法,由于函数的提升,且不受条件判断控制,应该是输出2的。可是我运行却报错了。然后我把条件控制去掉,像这样:    fun();//2     function fun() {        console.log("1");     }     function fun() {        console.log("2");     }果然,输出了2然后,我把条件语句加上,在最后执行函数,像这样:var a=true;if(a){     function fun() {         console.log("1");     } }else{     function fun() {         console.log("2");     } }fun();//1输出1谁能解释一下,第一个输出的原理?以及和书上的不一样,是因为浏览器升级了的缘故吗?
查看完整描述

2 回答

?
qq_慕容0484495

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

书上也说了,这样声明函数不可靠,在JavaScript未来的版本可能发生变化。

我用的node12,输出的也是1,可能书上的预言应验了。

查看完整回答
反对 回复 2020-01-14
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

首先是不赞成这种写法,然后我分享一下在 Node5 下的试验

var a = true;

fun();  // 这里输出 3if (a) {    function fun() {        console.log("1");
    }
} else {    function fun() {        console.log("2");
    }
}

fun();  // 这里输出 1function fun() {    console.log("3");
}

所以可以分析出,最下面的 .log(3) 那个函数是函数定义,上面两个是被当作函数表达式处理的。但是命名函数表达式的名称只能在函数表达式内部使用,所以这里如果是当作命名函数表达式的话,又不科学了。再做个试验,用括号强制把中间两个函数申明为函数表达式

var a = true;

fun();  // 这里输出 3if (a) {
    (function fun() {        console.log("1");
    });
} else {
    (function fun() {        console.log("2");
    });
}

fun();  // 这里输出 3function fun() {    console.log("3");
}

符合对命名函数表达式的判断。

所以,目前只能是认为解释器把那句话解释成了 var fun = function fun() {....}


查看完整回答
反对 回复 2018-10-11
  • 2 回答
  • 0 关注
  • 745 浏览
慕课专栏
更多

添加回答

举报

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