function与感叹号
2016-03-11 09:35
232 查看
通常,我们调用一个方法的方式就是 FunctionName()
但是,如果我们尝试为一个“定义函数”末尾加上(),解析器是无法理解的。
定义函数的调用方式应该是 msg() ; 那为什么将函数体部分用()包裹起来就可以了呢?
原来,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数。也就是说,任何能将函数变成一个函数表达式的作法,都可以使解析器正确的调用定义函数。而 ! 就是其中一个,而 + - || 都有这样的功能。
任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别。比如:
赋值,逻辑,甚至是逗号,各种操作符都可以告诉解析器,这个不是函数声明,它是个函数表达式。并且,对函数一元运算可以算的上是消除歧义最快的方式,感叹号只是其中之一,如果不在乎返回值,这些一元运算都是有效的:
甚至下面这些关键字,都能很好的工作:
最后,括号做的事情也是一样的,消除歧义才是它真正的工作,而不是把函数作为一个整体,所以无论括号括在声明上还是把整个函数都括在里面,都是合法的:
说了这么多,实则在说的一些都是最为基础的概念——语句,表达式,表达式语句,这些概念如同指针与指针变量一样容易产生混淆。虽然这种混淆对编程无表征影响,但却是一块绊脚石随时可能因为它而头破血流。
但是,如果我们尝试为一个“定义函数”末尾加上(),解析器是无法理解的。
function msg(){ alert('xxx'); }();//解析器是无法理解的
定义函数的调用方式应该是 msg() ; 那为什么将函数体部分用()包裹起来就可以了呢?
原来,使用括号包裹定义函数体,解析器将会以函数表达式的方式去调用定义函数。也就是说,任何能将函数变成一个函数表达式的作法,都可以使解析器正确的调用定义函数。而 ! 就是其中一个,而 + - || 都有这样的功能。
任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别。比如:
var i = function(){return 10}(); // undefined 1 && function(){return true}(); // true 1, function(){alert('xxx')}(); // undefined
赋值,逻辑,甚至是逗号,各种操作符都可以告诉解析器,这个不是函数声明,它是个函数表达式。并且,对函数一元运算可以算的上是消除歧义最快的方式,感叹号只是其中之一,如果不在乎返回值,这些一元运算都是有效的:
!function(){alert('xxx')}() // true +function(){alert('xxx')}() // NaN -function(){alert('xxx')}() // NaN ~function(){alert('xxx')}() // -1
甚至下面这些关键字,都能很好的工作:
void function(){alert('xxx')}() // undefined new function(){alert('xxx')}() // Object delete function(){alert('xxx')}() // true
最后,括号做的事情也是一样的,消除歧义才是它真正的工作,而不是把函数作为一个整体,所以无论括号括在声明上还是把整个函数都括在里面,都是合法的:
(function(){alert('xxx')})() // undefined (function(){alert('xxx')}()) // undefined
说了这么多,实则在说的一些都是最为基础的概念——语句,表达式,表达式语句,这些概念如同指针与指针变量一样容易产生混淆。虽然这种混淆对编程无表征影响,但却是一块绊脚石随时可能因为它而头破血流。
相关文章推荐
- WGS84坐标与北京54坐标转换
- xcodebuild命令行编译错误问题解决
- 大量数据(几亿)里筛素数
- Windows Embedded Standard 8 入门指南 1 of 5
- MyEclipse修改项目名称
- Java 标注(Annotation)详解
- Idea基本设置
- Android OpenGL 播放视频学习
- 制作GIF动画
- GeoHash核心原理解析
- HDU-1372-Knight Moves
- listview checkbox重复选择的问题
- Redis内存使用优化与存储
- 网络性能评估工具iperf
- Gradle命令和配置
- 在IBW中的Windows PE阶段调用自定义应用程序应注意的路径问题
- Spark map-side-join 关联优化
- bootstrap-model-弹出框背景禁止点击
- kk-并发控制和处理
- OpenCV Mat转IplImage陷阱