博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
立即执行函数: (function(){...})() 与 (function(){...}()) 有什么区别?
阅读量:6582 次
发布时间:2019-06-24

本文共 1647 字,大约阅读时间需要 5 分钟。

没有区别。

定义函数有两种方式:一种是函数声明,另一种是函数表达式. 函数声明: function foo(arg0,arg1,arg2){ //函数体 } 函数表达式: var foo = function (arg0,arg1,arg2){ //函数体 } ------------------------------------------------------------------------------------------------------
function foo() {...} // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。 foo(); // 这是语句,Statement;解释器遇到语句是会运行它的。

IIFE 并非必须,传统一点可以这么写:

function foo() {...} foo();

那么为什么要 IIFE?

  1. 传统的方法啰嗦,定义和执行分开写;
  2. 传统的方法直接污染全局命名空间(浏览器里的 global 对象,如 window

如果想要立即执行函数表达式这个函数,该怎么办?

于是,开发者们想找一个可以解决以上问题的写法。那么像下面这么写行不行呢?

-------------------------------------------------------------------------------------------------

function foo(参数){代码块}( ); //这样写不可以 (function foo(参数){代码块}); //这样写是可以的 -----------------------------------------------------------------------------------------------

当然是不能,但是为什么呢?因为 function foo(...){} 这个部分只是一个声明,对于解释器来说,就好像你写了一个字符串 "function foo(...){}",它需要使用解析函数,比如 eval() 来执行它才可以。所以把 () 直接放在声明后面是不会执行,这是错误的语法。

如何把它变得正确?说起来也简单,只要把 声明 变成 表达式(Expression) 就可以了。

实际上转变表达式的办法还是很多的,最常见的办法是把函数声明用一对 () 包裹起来,于是就变成了:

(function foo() {...}) // 这里是故意换行,实际上可以和下面的括号连起来 ();

这就等价于:

var foo = function () {...}; // 这就不是定义,而是表达式了。 foo();

但是之前我们说不行的那个写法,其实也可以直接用括号包起来,这也是一种等价的表达式:

(function foo(){...}());

所以你问有没有区别?很简单:木有~

另外,刚才说过转变表达式的方式很多,的确还有很多别的写法,比如:

!function foo() {...}();

或者

+function foo() {...}();

这些都可以。

我个人挺偏爱用 void 来转变表达式,因为此关键字不会有返回值。不过这一点真的没有什么要紧的,就当我“龟毛”好了……

 
void function () { // 这里是真正需要的代码 }();

OK,所谓不去污染全局命名空间,是因为 IIFE 创建了一个新的函数作用域,你真正的业务代码被封装在其中,自然就不会触碰到全局对象了。如果你需要全局对象,那就 pass 给 IIFE:

void function (global) {    // 在这里,global 就是全局对象了 }(this) // 在浏览器里,this 就是 window 对象

转载于:https://www.cnblogs.com/aixiuxiu/p/6200559.html

你可能感兴趣的文章
循环链表,约瑟夫环问题
查看>>
Spring事务管理2----编程式事务管理
查看>>
vsCode怎么为一个前端项目配置ts的运行环境
查看>>
优化Web中的性能
查看>>
【SAP BusinessObjects】WEBI中的动态求和,累加函数的使用
查看>>
python3 CERTIFICATE_VERIFY_FAILED错误 certificate verify failed
查看>>
微软职位内部推荐-Senior SDE
查看>>
unity 人工智能AI,装备解锁临时笔记
查看>>
OOP 2.2 构造函数
查看>>
矩阵的坐标变换(转)
查看>>
Tomcat 服务器性能优化
查看>>
【框架学习】ibatis DAO框架分析
查看>>
Android Design Support Library使用详解
查看>>
Java历程-初学篇 Day03扫描仪与类型转换
查看>>
2017.10.26 ECN + product spec+ cypress ble module test+
查看>>
L92
查看>>
分享几个cocos2dx的小游戏
查看>>
简单几何(凸包) POJ 2187 Beauty Contest
查看>>
模拟 HDOJ 5095 Linearization of the kernel functions in SVM
查看>>
IDEA入门级使用教程-
查看>>