JavaScript浅析 -- IIFE立即执行函数表达式

一、什么是IIFE?

所谓IIFE(Immediately-Invoked Function Expression)翻译过来就是立即执行函数表达式。其实就是

  1. 声明了一个函数。
  2. 立即执行这个函数。

他有好多种写法,如下代码就是经典的写法:

(function() { console.log('立即执行') })()

如上,前面是一个函数,然后调用函数是‘函数名()’,所以后面加()执行该函数。这个比较好理解,那前面那个为啥要加括号呢?不加可以不?我们来试试:

function() { console.log('立即执行') }() // Uncaught SyntaxError: Unexpected token (

结果是报错Uncaught SyntaxError: Unexpected token (,为啥呢?其实因为js解释代码的时候遇到function会认为是一个函数声明,而声明函数却没有找到函数名,所以遇到第一个左括号就报错了。接着我们加上函数名修改如下:

function func() { console.log('立即执行') }() // Uncaught SyntaxError: Unexpected token )

还是报错Uncaught SyntaxError: Unexpected token ),好在错误变了,不过这次又是为啥?其实因为前面的函数声明包含函数名已经是一个完整的语句了,所以后面的()又另做为一个语句。相当于如下代码:

function func() { console.log('立即执行') };
();

而分组操作符()中的表达式又不能为空,所以是遇到最后一个右括号才报的错。那怎样才能让两者并成一个语句从而实现函数的执行呢?

为了解决上面的两个问题,只要让其变成表达式,加个括号就行了,因为括号内部不能有语句所以会认为是一个表达式。有如下两种写法:

  • (function func(){})()
  • (function func(){}())

其原理都是一样的,都是为了让其变成一个表达式。而其实让他变成表达式的写法不止上面两种,上面两种是比较经典易读的写法。还有如下几种,原理都是一样的:

// 运算符直接转表达式法
var i = function(){ console.log('立即执行') }();
!function(){ console.log('立即执行') }();
~function(){ console.log('立即执行') }();
-function(){ console.log('立即执行') }();
+function(){ console.log('立即执行') }();

// 解析器在遇到& || ,等操作符时,会把两边默认为表达式。
// 但注意交换位置就不行,因为如果把function放在前面则还是会认为是声明
true & function(){ console.log('立即执行') }();
0, function(){ console.log('立即执行') }();

// 以及new
new function(){ console.log('立即执行') }
new function(){ console.log('立即执行') }() // 带参数

二、IIFE有啥用?

先来看个例子,如下声明了一个变量i并输出:

var i = 0;
console.log(i);

但是这样做有时候会有一个问题,在这个全局作用域下声明的i会影响到整个作用域(全局污染),也就是整个全局作用域下的i都变成了0,而我们只是单纯想在这里可用,应该怎么做呢?在Js(ES6之前)里只分为全局作用域和局部作用域 ,局部作用域一般是通过函数来创建一个单独的作用域,这个作用域下只有函数内可用。所以将上面改写如下:

function a() {
    var i = 0;
    console.log(i);
}
a();

这样的话,i就只在函数a里面才有效。可是。。。却多出来一个变量a,还是污染了全局。其实这个a也是可以避免的,因为我们声明了这个函数只是想利用他的局部作用域而已,声明完就立马执行了,何必起个名字呢。所以再进一步改写如下:

(function() {
    var i = 0;
    console.log(i);
})()

这样立即执行函数表达式就诞生了,神奇吧?(其实还是挺鸡肋的,代码写的这么复杂只是想创建一个不污染全局的变量而已,在ES6之后有了块级作用域和let等,这些问题得到了改善)。
所以经过上面的例子,我们大概就能体会立即执行函数表达式有啥用了。简单来说:

  • IIFE的作用就是创建一个独立的作用域。在这个作用域里面的变量只有其内可以访问,从而避免变量污染
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,148评论 0 13
  •   函数表达式是 JavaScript 中的一个既强大有容易令人困惑的特性。定义函数的的方式有两种: 函数声明; ...
    霜天晓阅读 817评论 0 1
  • 函数是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 概述 函数的声明 JavaSc...
    许先生__阅读 446评论 0 1
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,560评论 0 5
  • 今天下班回到家里,你看到你孩子的学业成绩单,一向很优秀的孩子,但是这次考试成绩考的非常糟糕,本有工作上不满意的你,...
    戴老师成长记录仪阅读 503评论 0 3