7.立即执行函数

来源:互联网 发布:室外装修设计软件 编辑:程序博客网 时间:2024/05/19 00:53

一些应该掌握的知识点

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

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

    • 方式一: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。

原创粉丝点击