JavaScript 立即执行函数

  • 在JavaScript中,每一个函数被调用时,都会创建一个新的执行上下文。因为在函数里定义的变量和函数是唯一在内部被访问的变量,为而不是在外部被访问的变量,当调用函数时, 函数提供的上下文提供了一个非常简单的方法创建私有变量。

立即执行函数

  • 当圆括号出现在匿名函数的末尾调用函数时,它会默认将函数当成是函数声明。
  • 当圆括号包裹函数时, 它会默认将函数作为表达式去解析,而不是函数声明。
函数声明: 
function () {}(); //会报错  Function statements require a function name

function f() {}();//不报错,也不会执行
函数表达式:
(function() {})(); //正确执行

var foo = function () {
console.log(1111);
}(); //正确执行

true && function () {
  console.log(1111);
}(); //正确执行

如果你并不关心返回值, 或者让你的代码尽可能的易读,可以在函数前面加上一个一元操作符来存储字节。

!function(){/* code */}();
~function(){/* code */}();
-function(){/* code */}();
+function(){/* code */}();

new function() {}//直接执行
new function() {}(); //仅需传递参数时才需要加括号

关于括号

  1. 一些情况下, 额外的带着歧义的括号围绕函数表达式是没有必要的,因为此时括号已经将其作为一个表达式进行表达; 正常情况下括号用于调用函数表达式比较常用。
  2. 例子中括号指明函数表达式会被立即调用, 而且变量将会存储函数的结果,而不是函数本身。当这是一个很长的函数时可以节约阅读代码的时间,不用滚动或搜索页面看清函数是否被调用。
  3. 作为规则,当写清楚清晰代码时,有必要阻止JavaScript抛出的错误, 同样也有必要阻止其他开发者对你抛出的错误。

保存闭包状态

当函数被调用时,参数会被传递, 而当函数表达式被立即调用时, 参数也会被传递。 但是一个立即调用的函数表达式可以用来锁定值并且有效的保存此时的状态, 因为任何定义在一个函数内的函数都可以使用外面函数传递进来的参数和变量(这种关系被叫做闭包)。

举个lockedIndex的例子:
var elems = document.getElementsByTagName('a');
for(var i = 0;i < elems.length;i++) {
    (function(lockedInIndex){
        elems[i].addEventListener('click',function(e){
            e.preventDefault();
            alert('I am link #' + lockedInIndex);
            },false)
    })(i);
}

立即执行函数一个最为著名的优势是,就算它没有命名或者说是匿名,函数表达式也可以在没有使用标识符的情况下被立即调用, 一个闭包也可以在没有当前变量污染的情况下被使用。

自执行函数

1. 递归调用自己
function foo() {foo()};
2. 自执行匿名函数 (因为她没有表示符,必须使用arguments.callee来调用自己)
(function() {arguments.callee();})
3. 自执行匿名函数,但是foo标识符作为它的引用时,可用foo来调用
var foo  = function() {foo();};

模块模式

  • 返回值用对象代替了函数
var counter = (function(){
    var i = 0;
    return {
        get: function(){
            return i;
        },
        set: function(val){
            i = val;
        },
        increment: function(){
            return ++i;
        }
    }
    }());
    counter.get();//0
    counter.set(3);
    counter.increment();//4
    counter.increment();//5

    conuter.i;//undefined (`i` is not a property of the returned object)
    i;//ReferenceError: i is not defined (it only exists inside the closure)
  • 模块模式方法不仅相当的简单厉害。非常少的代码,你可以有效的利用与方法属性相关命名,在一个对象里,组织全部的模块化代码即最小化了全局变量的污染也创造了使用变量。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352