javascript - 看到函数声明这块有个函数不是很理解
问题描述
这是js高程上面的一个例子看到函数声明有一个代码
if(condition){ function sayHi(){alert(’hi’) }}else{ function sayHi(){alert(’Yo’) }}
说是这段代码无效语法,大多数浏览器会返回第二个声明,firefox会返回第一个声明,这是为什么?如果改成函数表达式形式的就可以了,这又是为什么?
var sayHi;if(condition){ sayHi=function(){alert(’Hi’) }}else{ sayHi=function(){alert(’Yo!’) }}
问题解答
回答1:因为第一个是函数声明, 但是一般不会放在if-else中声明函数
第二个是把匿名函数赋值给变量 ,不存在提升之类的
回答2:直接写function xxx(){} 会导致声明提前,如果有两个同名的这样的函数,相当于在顶部执行了两次var xxx,所以无效
回答3:和什么声明前置没有关系,高程第三部那时候JavaScript规范还都是ES5,浏览器还没有实现块级作用域(ES2016+),作用域级别只是函数级别的。所以你写的
if(condition){ function sayHi(){alert(’hi’) }}else{ function sayHi(){alert(’Yo’) }}
和写的
function sayHi(){ alert(’hi’)}function sayHi(){ alert(’Yo’)}
没有本质区别
回答4:js是有声明提前的!!!function会在声明时直接提到作用域顶端。if中不存在作用域,所以两个function是一个作用域,第二个会替掉第一个。! 而你第二段代码,先声明了变量sayhi,在if判断后才对sayhi进行赋值,
相关文章:
1. node.js - npm run dev报错2. mysql - 仅仅只是把单引号与反斜杠转义不用prepare statement能否避免sql注入?3. node.js - npm安装模块时,在cmd上显示的是一条白线,白线前面是一天反斜线转圈圈,然后就出现npm ERR错误了,求帮助,谢谢4. 无法为JSP编译类:无法解析类型java.util.Map $ Entry。从所需的.class文件间接引用它5. PC 手机兼容的 编辑器6. javascript - 如何将一个长为365的数组对象按月份切割成12组?7. 求救一下,用新版的phpstudy,数据库过段时间会消失是什么情况?8. css3 - 扩展本地项目中阿里的iconfont字体库,添加图标字体9. css3不包括10. html - angularJS中switch切换开关按钮不能操作

网公网安备