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

JS中函数表达式只会提升声明不会提升函数定义,这样如果喜欢用函数表达式而非函数声明,但是调用顺序和定义顺序错乱时不是很蛋疼吗?

JS中函数表达式只会提升声明不会提升函数定义,这样如果喜欢用函数表达式而非函数声明,但是调用顺序和定义顺序错乱时不是很蛋疼吗?

慕少森 2019-04-07 11:18:32
函数声明不仅会提升声明,还会提升定义,如下foo()//调用成功functionfoo(){}而函数表达式只会提升声明,不会提升定义,如下foo()//有foo这个变量,但它却不是函数,所以调用失败varfoo=function(){}如果喜欢用函数表达式,这不是很蛋疼吗?还要注意调用和定义出现的顺序?
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

在《编写可维护的JavaScript》中提到,JavaScript代码最好是保持这样的结构。
在一个函数作用域内
(function(){
1.var的各种变量声明
2.通用工具函数的声明。
3.....
})();
当然书上推荐这种写法肯定是有他的道理的。
第一点就是楼上面提到的函数声明与函数定义。JavaScript预解析会解析整个代码中使用var和function的地方。所以在代码的任何地方调用这些输出要么是undefined,要么就已经被赋给了值。所以将所有会被编译器预编译的代码都写在代码的最前头,既可以很清晰的让读代码的人清楚在这个作用域内有哪些函数与变量,也方便在控制台进行调试。也可以防止程序员在编写代码的时候,不小心再次定义了名字相同的函数或者变量。而且重复定义不报错,只会覆盖之前的。
                            
查看完整回答
反对 回复 2019-04-07
?
守候你守候我

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

应该就是这样吧。
有一本术里说:
可以把变量的声明行为理解成两部分:声明和赋值。js隐式的将变量的声明提升到函数顶部,而赋值留在原地。
至于这两种函数声明方式,也套用一篇文章里说的:
JS解析器会在预解析阶段优先读取函数声明的代码,以确保函数能够被引用到;而对于函数表达式,只有在执行到相应的语句时才进行解析。
                            
查看完整回答
反对 回复 2019-04-07
  • 2 回答
  • 0 关注
  • 293 浏览
慕课专栏
更多

添加回答

举报

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