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

JavaScript:函数声明与函数表达式?

JavaScript:函数声明与函数表达式?

森林海 2019-02-12 10:07:36
为什么这个是无效语法呢if(condition){function sayHi(){alert("Hi!");}}else{function sayHi(){alert("Yo!");}}而下面这个确是有效的var sayHi;if(condition){sayHi=function sayHi(){alert("Hi!");};}else{sayHi=function sayHi(){alert("Yo!");};}
查看完整描述

3 回答

?
慕侠2389804

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

javascript虽然是解释执行的语言,但也会进行预编译。


123456789if(condition){    function sayHi(){        alert("Hi!");    }}else{    function sayHi(){        alert("Yo!");    }}


这种形式,JS引擎在预编译的过程中会注册方法到window对象下,就是window.sayHi。

而不会顾及if else条件,导致重复的sayHi方法被注册,在这种情况下是无效语法。


12345678910var sayHi;if(condition){    sayHi=function sayHi(){        alert("Hi!");    };}else{    sayHi=function sayHi(){        alert("Yo!");    };}


而下面这种是作为一个 变量(而非函数function),变量是可以被重复赋值的,所以语法不会有问题。


不知道有没有说清楚。


查看完整回答
反对 回复 2019-03-24
?
绝地无双

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

我只说第一个。


第一个语法上没什么问题,但是和浏览器解析js不同而获得意想不到的结果。


1. 在前面调用。

1234567891011sayHi();var condition = true;if(condition){    function sayHi(){        alert("Hi!");    }}else{    function sayHi(){        alert("Yo!");    }}

这种时候除了firefox会报错,其他的浏览器会弹出“Yo!"。


2. 在后面调用

12345678910if(true){    function sayHi(){        alert("Hi!");    }}else{    function sayHi(){        alert("Yo!");    }}sayHi();

firefox会弹出"Hi!",其他的浏览器会弹出"Yo!"。


这里firefox会出现这种情况是因为firefox会把if里面的function定义当作表达式来处理。


MDN的原文

Functions can be conditionally declared. That is, a function definition can be nested within an if statement. Technically, such declarations are not actually function declarations; they are function expressions.


所以这种不兼容的方法不要使用。



查看完整回答
反对 回复 2019-03-24
?
肥皂起泡泡

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

function sayHi(){
alert('hi')
}
function sayHi(){
alert('Yo')
}

你写的第一个无效那个,等于分开写,下面的就会把上面的覆盖掉,只显示下面的了



查看完整回答
反对 回复 2019-03-24
  • 3 回答
  • 0 关注
  • 586 浏览

添加回答

举报

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