JS--- (function(){...})() 是什么
来源:互联网 发布:188旅游网站源码 编辑:程序博客网 时间:2024/05/22 08:01
function foo() {...} // 这是定义,Declaration;定义只是让解释器知道其存在,但是不会运行。foo(); // 这是语句,Statement;解释器遇到语句是会运行它的。
IIFE 并非必须,传统一点可以这么写:
function foo() {...}foo();
那么为什么要 IIFE?
- 传统的方法啰嗦,定义和执行分开写;
- 传统的方法直接污染全局命名空间(浏览器里的
global
对象,如window
)
于是,开发者们想找一个可以解决以上问题的写法。那么像下面这么写行不行呢?
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://segmentfault.com/q/1010000000442042
0 0
- JS--- (function(){...})() 是什么
- js中function(){}中小括号中的内容到底是什么
- js 原型的问题 Object 和 Function 到底是什么关系?
- Function究竟是什么?
- (function($){...})(jQuery)是什么…
- (function(){ })();这是什么语法?
- js Function function
- js function
- JS Function
- js function
- JS Function
- Js function
- js-function()
- js function()
- js function
- js中 a : function(){}这是什么格式? 代表什么含义?怎样学习这样的格式?
- js中 a : function(){}这是什么格式? 代表什么含义?怎样学习这样的格式?
- js如果在function之前加上感叹号 (!) 等运算符是什么作用
- iOS run loop 详解
- 20160527 数据分析与SAS6 新建逻辑库与数据集
- qt-画波形图
- 20. 尚硅谷_佟刚_SpringMVC_ModelAttribute注解之源码分析(无写笔记)
- lintcode ----在二叉查找树中插入节点
- JS--- (function(){...})() 是什么
- POJ-20407Relatives/NYOJ-333mdd的烦恼,欧拉函数简单应用,模板A
- Android 状态保存 生命周期 onSaveInstanceState onRestoreInstanceState 方法
- leetcode05- Longest Palindromic Substring之Java版本
- 学习库
- HTTP 403
- Android系统组件之Activity的生命周期
- Hadoop— ipc.Client: Retrying connect to server: localhost/127.0.0.1:8020. Already tried 5 time(s).
- 判读鼠标是否在UI上