Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

未定义行为 - 代码块中的函数定义

  自从JavaScript诞生以来,一直都支持在代码块中定义函数。但随着规范版本的变更,这个定义也一直在发生改变。目前的实现,可能会参考的规范有JScript、ES5、ES6,而这三个最主要的版本对代码块中的函数定义都有不同的定义方式。
  目前版本的IE和Chrome使用的就是JScript的定义方式,它们把函数定义视为语句,这些函数定义语句会和变量声明语句一样被预处理(或者大家更喜欢称为“变量提升”)。Firefox用的是ES6的定义,这个定义中虽然函数也会被预处理,但它被限制在了一个block作用域中。那么,ES5呢?ES5在句法上是禁止函数出现在代码块中的。它不把函数定义作于语句,而是作为一种与语句同级的句法元素。如果浏览器照这个来实现,势必会导致很多原有的程序无法执行,因为在块作用域中定义函数的用法并不罕见。所以,一些现代浏览器上的实现只对严格模式采用它。
  其实浏览器的实现也很为难,因为有这么多标准可参考。然而,JScript太旧、ES5太苛刻、ES6不稳定,没有一个完美的解决方案。因此就目前而言,这个行为属于未定行为,浏览器怎么实现都有可能!总之,建议不要在代码块中使用函数定义。

  相关文章:关于函数定义的提升
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^