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

if/etc语句中的函数声明?

if/etc语句中的函数声明?

拉丁的传说 2019-07-16 10:14:18
if/etc语句中的函数声明?如何处理函数声明?var abc = '';if(1 === 0){     function a(){         abc = 7;     }}else if('a' === 'a'){     function a(){         abc = 19;     }}else if('foo' === 'bar'){     function a(){         abc = 'foo';     }} a();document.write(abc); //writes "foo" even though 'foo' !== 'bar'此示例在Chrome和Firefox中生成不同的输出。铬输出fooFF产出19.
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

当问到这个问题时,ECMAScript 5(ES5)很普遍。在es5的严格模式下,函数声明不能嵌套在if如问题中所示。在非严格模式下,结果是不可预测的。不同的浏览器和引擎为如何处理块内的函数声明实现了自己的规则。

到2018年,许多浏览器都支持ECMAScript 2015(ES 2015)函数声明现在允许在块内。..在ES 2015环境中,块内的函数声明将在该块中限定作用域。问题中的代码将导致未定义的函数错误,因为函数a仅在if语句,因此在全局范围内不存在。

如果需要有条件地定义函数,则应使用函数表达式.


查看完整回答
反对 回复 2019-07-16
?
冉冉说

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

ECMA-262 v5要求实现在第一次输入任何新的全局或函数级执行上下文时注册所有函数和变量声明。Chrome技术上就在这里,因为它正在查看elsethen块和注册a()在处决之前。不幸的是,它产生了最不可读的结果。

FF正在等待,直到它在计算之前对if语句进行评估,并将函数和变量声明添加到当前上下文中。顺便说一下。这两个浏览器都是这样做的,在CATCH中,最后是子句。

实际上,这只是两个不同的ECMA实现来处理一个不应该出现的特性的问题。当前的场景说明了为什么函数声明不应该在控制流语句中。


查看完整回答
反对 回复 2019-07-16
  • 3 回答
  • 0 关注
  • 349 浏览
慕课专栏
更多

添加回答

举报

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