这个问题可以从不同的角度来看,但从结果上来说 :他们是一样的
首先,如果从AST(抽象语法树)的角度来看,两者的AST是一模一样的,最终结果都是一次函数调用。因此,就解析器产生的结果论而言,两者是没有区别的。

其次 ,从作用上看,前文已经说了,两者的作用都是创建一个函数并调用之。
那么为什么要创建一个函数并立即调用呢,我想大多数是因为javascript的代码默认在全局环境下执行,在此声明的所有变量都会变成全局变量,这很容易导致全局对象的污染。因此我们不得不找一个办法来隔离这些变量,而函数正好会创建属于自己的作用域,因此创建一个匿名函数并立即调用(有称此为IIFE-Immediately Invoked Function Exprssion-立即调用的函数表达式)成为了一种几乎公认的方案。
随后,又为什么要这么写呢?原因自然是在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种作用:确立运算优先级,以及分组运算符(http://es5.github.com/#x11.1.6),从代码上看,显然没有进行数学或逻辑运算,因此我认为这里的括号属于分组运算符
根据标准,分组运算符的作用是:

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

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

抛开像Reference类型这种词汇,这里的一个关键词应当是“ 评估 ”(对evaluate的翻译一直把握不好,姑且这么叫吧),但是关于分组运算符,又有一个很重要的下文:

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

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

有很多专用的名词,看起来确实复杂,简而言之,使用括号运算符本身不会让括号中的代码立即执行,只有当括号包含的这个“分组”参与其他运算时,才会执行。因此,(function(){})()这个语句,其实是首先用分组运算符评估了一个函数表达式,随后参与“函数调用”。而(function(){}())这个语句,则是用分组运算符评估了一个函数调用,随后由于语句的结束而被执行。从语句上来说有细微的差距,当然就结果而言是一样的,最初的AST分析也可以证实这点,分组运算符在AST中完全没有体现出来。

Javacript中(function(){})() 与 (function(){}()) 区别 {转}相关推荐

  1. 中单引号和双引号的区别与联系_VB中Sub与function的联系与区别

    function 可以用自身名字返回一个值,sub 需定义别的变量,用传址方式传回值. Sub 过程与Function 过程的区别: 1. Sub 过程定义时无需定义返回值类型,而Function 过 ...

  2. verilog中task、function和moudle的区别

    verilog中task.function和moudle的区别 task可以启动其他任务或者函数:而function不能启动任务 task可以定义自己的仿真时间,而function不可以: funct ...

  3. VB中Sub过程与Function过程的区别

    VB的通用过程分为两种类型:Sub过程和Function过程.通用过程既可以保存在窗体模块(.Frm)中,也可以保存在标准模块(.Bas)中.通用过程与事件过程不同,它不依附于某一对象,也不是有对象的 ...

  4. js中(function(){}()),(function(){})(),$(function(){});之间的区别

    1. (function(){}())与(function(){})() 这两种写法,都是一种立即执行函数的写法,即IIFE (Immediately Invoked Function Express ...

  5. JS中 function 和 Function 的区别

    Function是一个构造器,是一个构造函数,用于创建一个函数对象.使用function创建的变量是一个指针,指向的对象是一个Function对象. function是一个关键字,可以声明一个函数对象 ...

  6. JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别?

    某天写代码突然县道这个问题,顺势总结一波 JavaScript 函数和变量声明的"提前"(hoist)行为 简单的说 如果我们使用 匿名函数 var a = {} 这种方式, 编译 ...

  7. jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别详细讲解

    1.(function($) {-})(jQuery); 1).原理: 这实际上是匿名函数,如下: function(arg){-} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写 ...

  8. java.util接口_Java 8中java.util.function包中的谓词和使用者接口

    java.util接口 在上一篇文章中,我写了关于Function接口的内容 ,它是java.util.package的一部分. 我还提到了Predicate接口,它是同一包的一部分,在这篇文章中,我 ...

  9. Java 8中java.util.function包中的谓词和使用者接口

    在我以前的文章中,我写了关于Function接口的内容 ,它是java.util.package的一部分. 我还提到了Predicate接口,它是同一包的一部分,在这篇文章中,我将向您展示如何使用Pr ...

最新文章

  1. ICA(独立成分分析)笔记
  2. 【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序打印字符串 | 递归要素 | 递归停止条件 | 递归操作 )
  3. SpringMVC实现简单登录
  4. 2016年安全身份识别主流趋势
  5. ASP与數据庫,文本文件鏈接精髓
  6. 10.15 iptables filter表小案例;10.16—10.18 iptables nat
  7. 凯立德地图导航2020年最新版车载_高精度地图会把自动驾驶带跑偏吗?
  8. 【数字信号去噪】基于matlab低通滤波数字信号去噪【含Matlab源码 964期】
  9. LU分解法求解线性方程组
  10. java基于ssm的学校教务管理系统的设计与实现论文
  11. 《微信小程序进阶实战之分答应用开发(中级项目)》(完整版)
  12. 线性方程组基础解系的简便算法
  13. CentOS7安装PHP5.3.28
  14. php上传头像的代码,关于微信小程序中上传头像的代码
  15. 【产品笔记】2.互联网产品修炼
  16. c#ATM之功能篇(存钱,取钱,转账,交易明细)完结篇
  17. ogr2ogr转坐标
  18. 织梦图集php,织梦怎么为新图集页面增加图片下载功能
  19. 科普一下IP路由基础
  20. matlab模拟股票价格,matlab股票价格模拟

热门文章

  1. 看了无数文章,今天终于理解这些性能指标了
  2. 质量和品质的区别_议价采购,招标采购,比价采购的区别是什么?一文看懂?...
  3. php表单转json对象,form表单转Json提交的方法(推荐)
  4. 电大计算机网络本作业1,2017年最新电大计算机网络作业1-3答案.doc
  5. php base64图片大小,php 图片 base64编码相互转换
  6. 强类型视图 后台拿不到数据_SAP开发-ABAP数据字典(视图)
  7. java swt 双屏_SWT(JFace)体验之打开多个Form
  8. 机器学习就那么回事儿
  9. php mysql安装配置_转载:PHP,MySQL的安装与配置
  10. 2019斯坦福CS224n深度学习自然语言处理笔记(3)反向传播与计算图