JavaScript的 IIFE(即时执行方法)

函数
函数声明: function + 函数名 + ( [参数] ) + { 函数体 }

function foo(){ /*code*/ }

函数表达式:var fn = function( [参数] ){ 函数体 }

var foo = function(){ /*code*/ }

js中 函数跟随一对圆括号()表示函数调用

//函数声明语句写法
function test(){};
test();

//函数表达式写法
var test = function(){};
test();

但有时需要在定义函数之后,立即调用该函数。这种函数就叫做立即执行函数,全称为立即调用的函数表达式 IIFE (Imdiately Invoked Function Expression)

现在我们定义了一个函数(function foo(){} 或者 var foo = function(){}),函数名后加上一对小括号即可完成对该函数的调用,比如下面的代码:

var foo = function(){ /* code */ };
foo();

接下着我们来看下面的代码

function(){ /*code*/ }();
//Uncaught SyntaxError: Unexpected token (
/** 原因:
 ** 在javascript代码解释时,当遇到function关键字时,会默认把它当做是一个函数声明,而不是函数表达式,
 ** 如果没有把它显视地表达成函数表达式,就报错了,因为函数声明需要一个函数名,而上面的代码中函数没有函数名。
 **/

[注意]javascript引擎规定,如果function关键字出现在行首,一律解释成函数声明语句(一文章上说的,有待考证)

当给函数添加上函数名时,情况如下:

function foo(){ /*code*/ }();
//Uncaught SyntaxError: Unexpected token )
/** 原因:
 ** 在一个表达式后面加上括号,表示该表达式立即执行;
 ** 而如果是在一个语句后面加上括号,该括号完全和之前的语句不搭嘎,
 ** 而只是一个分组操作符,用来控制运算中的优先级(小括号里的先运算)。+
 ** 等同于: function foo(){ *code* }; ();
 ** 相当于先声明了一个叫foo的函数,之后进行()内的表达式运算,
 ** 但是()(分组操作符)内的表达式不能为空,所以报错。
 **/

最常用的两种办法:

// code1:
(function(){ /* code 2 */ })();
// code2:
(function(){ /* code 1 */ }()); 

code1 中,第一对括号()即包裹在function外部的作用实际是给js解释器||引擎提供一种解析方案,提示解释器该括号内部包括的是一整体内容。第二个括号的作用是函数调用执行,但是如果直接通过function(){//….}()或者function A(){//…}();是不能执行的,因为引擎默认在遇到function(){}结构时会认为是函数声明,最后面的()会被单独解析,然后就语法报错了。

同理前几种IIFE语句也是通过一元操作符+-~!变成了函数表达式,目的是为了提示js解析器,告诉js解释器该运算符附近是一个表达式。

IIFE方式和正常的先声明再调用相比较,有如下的特点:

  1. 实现立即执行,不需要先声明再调用。
  2. 匿名函数自身不污染全局环境,同时为内部变量提供作用于环境空间。(现在主流的框架都是用这个方式来初始化命名空间的)
  3. 缩写形参有利于内部代码的压缩
  4. 提供闭包环境,可以做闭包想做的事情
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值