摘要: (function() {})();和(function(){}());的区别

Javascript中有2个语法都与function关键字有关,分别是:

函数定义:function FunctionName(FormalParameterList) { FunctionBody }

函数表达式:function [FunctionName](FormalParameterList) { FunctionBody }

从语法的定义上看,这两者几乎是一模一样的(唯一的区别是函数表达式可以省略函数名称),那么就解释器而言,当遇到这个结构的语句时,判定为函数表达式还是函数定义呢?

就javascript的语法而言,如果一条语句是以function关键字开始,那么这段会被判定为函数定义。而函数定义是不能被立即执行的,这无疑会导致语法的错误(SyntaxError),因此就必须有一个办法,使解析器可以将之识别为函数表达式。

前面已经说到,解析器识别函数定义的条件是以function关键字开始,那么自然,只要在function关键字的前面有任何其他的元素,就会从函数定义转变为函数表达式,以下方法都是可以的,这个大家都知道:

~function() {}();

!function() {}();

void function() {}();

但是这几个方法都有一个特点,就是看起来很别扭,所以现在为止,以括号包裹成了比较公认的方案

回到正题,括号包裹同样有2个方式:(function() {})();和(function(){}());

他们的共通点是:都有括号。而括号在javascript中有2种作用:确立运算优先级,以及分组运算符,从代码上看,显然没有进行数学或逻辑运算,因此我认为这里的括号属于分组运算符。

根据标准,分组运算符的作用是:

Return the result of evaluating Expression. This may be of type Reference.

返回评估括号中的表达式的结果。结果可能是Reference类型。

抛开像Reference类型这种词汇,这里的一个关键词应当是“ 评估 ”,但是关于分组运算符,又有一个很重要的下文:

This algorithm does not apply GetValue to the result of evaluating Expression.

这个算法不会对估算的结果使用GetValue。

有很多专用的名词,看起来确实复杂,简而言之,使用括号运算符本身不会让括号中的代码立即执行,只有当括号包含的这个“分组”参与其他运算时,才会执行。因此,(function(){})()这个语句,其实是首先用分组运算符评估了一个函数表达式,随后参与“函数调用”。而(function(){}())这个语句,则是用分组运算符评估了一个函数调用,随后由于语句的结束而被执行。

最新文章

  1. 凭吊一下ASP.NET 5,然后跨平台,越跨越开心
  2. win10 下visual studio 2015 在调试模式下不能跟踪源文件
  3. Mellanox 8亿美元收购EZchip
  4. [LeetCode] Best Time to Buy and Sell Stock IV 买卖股票的最佳时间之四
  5. SQL Server 2005中的分区表
  6. HDU3466 背包DP
  7. 【APUE】Chapter17 Advanced IPC & sign extension & 结构体内存对齐
  8. Java for LeetCode 029 Divide Two Integers
  9. Node.js log4js日志记录
  10. MySQL扩展
  11. Django学习笔记(一)
  12. Javascript匿名函数
  13. java网络编程小白教程
  14. 【AtCoder】ARC080
  15. dedecms文章页调用地址(当前文章URL)如何操作?
  16. php--------删除数组的第一个元素和最后一个元素
  17. SpringData_Repository接口概述
  18. ognl,jstl,struts2标签中符号#,$,%的用法
  19. 基于注解的spring mvc 中使用 ajax json 的model
  20. Python-常用字符串转换实例

热门文章

  1. VMware 虚拟机 Ubuntu 不能全屏问题
  2. R中seurat等问题学习
  3. css 自定义滚动条
  4. 在PL/SQL中如何让程序暂停几秒钟
  5. PKU 1932 XYZZY(Floyd+Bellman||Spfa+Floyd)
  6. Kafka(一)
  7. struct2的xml文件中result的配置(转)
  8. Please check registry access list (whitelist/blacklist)
  9. Web服务器端程序的实现
  10. 联想(Lenovo)小新310经典版进bios方法