7.立即执行函数

一些应该掌握的知识点

  • 立即执行函数的定义:此类函数没有声明,在一次执行后立即释放,适合做初始化工作,可不命名

  • 立即执行函数的几种创建方式

    • 方式一:W3C标准写法
    • 注:函数后的圆括号用于传入外部参数

      (function () {
          document.write('sample')
      }())
    • 方式二

      (function sample1() {
          console.log('sample')
      } ())
    • 方式三

      (function sample2() {
          console.log('sample')
      })()
    • 方式四

      var sample3 = function () {
          console.log('sample');
      }()
    • 方式五

    • 注:符号’+’,’-‘,!’,’&&’,’||’可使变量声明变成函数表达式
      +function sample4() {
          console.log('sample');
      }()
  • 方式五的一个示例

    y = parseInt(window.prompt('请输入1或0'));
    y || function x () {document.write('sample');}(); 
    /* 当y的值为0时则执行函数x,否则不执行同理,
     当y的值为false时,则执行函数x,true则不执行 */
  • 一些案例分析

    • 一道百度笔试题(难)
    • 注:符号’()’是一个数学运算符
  var str = 'abc';
  str += 1;
  console.log(typeof
  +function test (str) { 
      console.log(str);
      var newStr = typeof str;
      console.log(newStr);
      if (newStr != 'string') {
          return (newStr + 'a');
      }
      console.log(newStr);    
      return newStr;
  }(str));
  //控制台顺序显示abc1,string,string,Number

分析:
  分析之前应该注意,语句console.log(+function test(str){})不仅会显示函数test的值类型,还会执行函数test。
  因为函数test通过一个数学运算符”+”被转换成了函数表达式,所以函数test的值类型为Number类型。

  • 立即执行函数其中一个用法的示例

    分析:
      如下所示一段代码

    function test () {
        var arr = [];
        for (var i = 0; i < 10; i++) {
            arr[i] = function () {
                console.log(i);
            }
        }
        return arr;
    }
    var outerArr = test();
    for (var j = 0; j < 10; j++) {
        outerArr[j]();
    }
      //控制台顺序显示10个10

      预想中如上所示代码可以在控制台顺序显示0到9,但实际执行这个代码的时候,发现最终控制台显示的是10个10,并没有达到预想效果,这是为什么呢?
      因为在执行最后的for循环时,函数arr[i]内部每次所调用外部的变量i,最终都指向函数test自己的AO,而函数test下的变量i在执行完test下的for循环时值最终被覆盖为10,此时程序才开始解释执行,因此函数arr[i]里每次循环执行的语句console.log(i)最终执行结果都为10。
      那如何解决这个问题呢?
      我们可以利用立即执行函数的特性解决这个问题,代码如下所示。

    function test () {
    var arr = [];
    for (var i = 0; i < 10; i++) {
        (function (j) {
            console.log(j);
        })(i)
    }
    return arr;
    }
    var outerArr = test(); //控制台顺序显示0到9

      如上例所示,在函数test下for循环中的立即执行函数中,圆括号内的变量i负责向形参j传入外部参数,由于test函数下for循环中的立即执行函数每次执行前都会创建一个自己的AO,同时每次执行完成后都会销毁自己的AO,所以形参j每次在立即执行函数执行时其实都是在参考不同的AO,所以立即执行函数执行时其中的语句console.log(j)每次都能输出不同的值,所以函数test执行时控制台顺序显示0到9,这样做的效果相当于在函数test下建立10个函数,每个函数在控制台顺次输出0到9。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值