zoukankan      html  css  js  c++  java
  • javascript--立即执行函数

      当函数被包含在一堆括号()内部就称为了一个表达式,通过在末尾上加上另一个()可以立即执行这个函数,这样的表达式就叫做立即执行函数表达式(Immediately Invoked Function Expression,简称IIFE),如:(function(){...})()或者(function(){...}())

      IIFE的另一个非常普遍用法就是在外层括号传入参数进去,给内部的匿名韩式调用,来看下代码吧:

    var a = 2;
        (function(global){
            var a = 3;
            console.log(a);             //3
            console.log(global.a);      //2
        })(window)
    

      可以看到将window作为参数传入内部函数中,内部函数通过global.a访问到全局变量a

      

      javascript支持函数式编程的,函数也可以作为对象传来传去,来看一段代码:

    (function IIFE(def){
            def(window);
        })(function def(global){
            var a = 3;
            console.log(a);             //3
            console.log(global.a);      //2
        });
    

      

      再来看看立即执行函数和闭包应用的一个经典例子:

    for(var i=0;i<5;i++){
            setTimeout(function(){
                console.log(i);
            },100)
        }
    

      这段代码看起来是循环5次,间隔100ms打印出0,1,2,3,4,但实际上只会输出五次5,因为定时器是异步事件,异步事件只能在同步事件执行完后才能执行,也就是说定时器的回调在for循环完才执行,这里需要使用IIFE声明并立即执行函数来创建作用域,修改一下代码:

    for(var i=0;i<5;i++){
            (function(i){
                setTimeout(function(){
                    console.log(i);
                },100)
            })(i);
        }
    

      在迭代里面使用IIFE会为每个迭代都生成一个新的作用域,使得延迟函数的回调可以将新的作用域封闭在每个迭代里,每个迭代都会含有依着正确的值给我们访问,记得实习第一天,老大给我出了个题,用原生js给5个li绑定点击事件,点击li弹出当前li的index,也是用这样的方法解决的。

      

  • 相关阅读:
    FreeMarker 2.3.17 发布,千年等一回
    NetBeans 时事通讯(刊号 # 150 Jun 11, 2011)
    2011 端午后,杭州支付宝
    FreeMarker 2.3.17 发布,千年等一回
    2011 端午后,杭州支付宝
    NetBeans 时事通讯(刊号 # 149 Jun 08, 2011)
    用Python实现一个简单的文件传输协议
    Scrapinghub | About Us
    用python实现一个socket echo程序 && tcp socket的几个关闭状态
    纯C日志函数库 zlog
  • 原文地址:https://www.cnblogs.com/weapon-x/p/5346428.html
Copyright © 2011-2022 走看看