JS立即执行函数

    很多时候我们在js中定义一个函数后,只需要执行该函数一次,比如数据初始化函数;这种情况下,定义一个函数就会浪费内存空间,这是我们可以使用立即执行函数(Immediately-Invoked Function Expression 即IIFE)。

函数调用

方式1:

    定义一个函数后,我们可以通过()进行调用,如下:

            function fn(){}

            fn();

    那么我们是否可以通过如下的方式直接调用函数呢?

            function fn(){}();      //SyntaxError: Unexpected token )

    结果是报语法错误,因为语句是无法执行的,所以js解析器在解析时,把该语句解析成了一个函数和一个分组操作符,如下:

            function fn(){}

            ();

    而分组操作符内不能为空,所以报了语法错误。

 方式2:

    另一个在函数定义和调用的方式如下:

            var fn = function(){};

            fn();

    可以看出,匿名函数赋值给一个变量后,也可以作为函数被调用,那么是否可以通过如下方式直接调用函数呢?

            function(){}();      //SyntaxError: Unexpected token (

    结果依然是报语法错误,原因是js解析时,除非显示的将函数定义为表达式,否则解析器都会将其当做函数申明,而上面的语句就是将其当做了函数申明,而函数声明必须要有函数名,故解析都( 括号后报错。

实现立即调用

    通过上面的分析可以看出,一个函数如果想要立即执行,那么就必须显示的将函数定义为表达式的形式。故可以通过如下的一些方式,定义一个立即执行函数:

    1. (function(){}())  //最推荐的方式,外面的括号将内部的函数显示的定义为函数表达式

    2. (function(){})()    //完全等同于以上的方式

    3. !function(){}();  // 通过!元素符将函数显示的定义为表达式,然后执行,同理:+,- 也可以

    4. var fn = function(){}();  //通过赋值运算符将函数显示的定义为表达式,然后执行

总之,实现函数立即执行的方式很多,但有的会与函数的返回值进行运行,如:!,+,- ;为了避免这种麻烦,我们通常采用1和2两种方式定义。

作用

    立即执行函数的作用:

        1. 解决闭包中的状态保存问题;(常见的一个函数内部返回多个函数,调用这些函数,打印父函数内部变量的问题)

        2. 模块化开发中,定义私有变量,防止污染全局;

        3. 初始化数据和页面

注意:函数表达式定义的函数,函数名外部无法引用,如下:

  1.  var fn = function f(){};

      console.log(typeof f);  //打印undefined,函数表达式的函数名f在外部是访问不到的

   2. if(function f(){}){

            console.log(typeof f);  //同理,打印undefined,if语句中的函数解析为函数表达式,函数名f在外部是访问不到的

        }

    

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

推荐阅读更多精彩内容

  • 引:原文 | 译文 一种私有变量创建方式,也是闭包的应用之一。 但是,很多时候,我们不需要函数声明,不需要后续的在...
    DHFE阅读 460评论 0 0
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,138评论 0 13
  • 函数的两种定义方法:函数声明 函数表达式 函数包括四个部分,function关键字、函数名、圆括号、花括号。期中函...
    8d2855a6c5d0阅读 1,856评论 0 3
  • 1.什么是立即执行函数只有表达式才可以被()符号执行。在了解立即执行函数之前先明确一下函数声明、函数表达式及匿名函...
    WangYatao阅读 357评论 0 0
  • 每当不开心的时候,我都会点开老友记的任意一集,默默看上几分钟,就会心情愉快起来。看着剧中人幸福的喜怒哀乐,看剧人也...
    1418domheng阅读 1,116评论 2 97