• javascript详解系列-函数表达式


    1.递归

    function fact(num){
       if(num<1){
            return 1;  
        }  
         else{
            return num*fact(num-1);
        }
    }

      var author = fact;

      fact= null;

      console.log(author(4));  会出现问题;

    改进型:

    var fact = (function f(num){
            if(num<1){
                return 1;
            }else{
                return num*f(num-1);
            }
        });

    即便把函数赋值给另一个名字,函数依然有效。

    2.闭包与变量

      作用域链的这种配置机制引出了一个副作用。即闭包只能取得包函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。

    function createFunctions(){
           var result = new Array();
           for(var i=0; i<10; i++){
             result[i] = function(){
              return i;
              }
           }  
            return result;
    }    

    这个函数会返回一个函数数组,表面上看,似乎每个函数都应该返回自己的索引值,即位置0的函数返回0,以此类推。但实际上,每个函数都返回10.因为每个函数的作用域链中都保存着createFunctions()

    的活动对象,所以他们引用的都是同一变量i,当函数createFunctions()返回后,变量i的值是10.但此时候函数应用者保存变量i的同一个变量i。所以在函数内部i的值是10;但是我们可以通过创建另一个匿名函数来符合预期,

    如下:

    function createFunctions(){
           var result = new Array();
           for(var i=0; i<10; i++){
             result[i] = function(num){
                  return function(){
                          return num;
                  }
              }(i);    
           }  
            return result;
    }  

    在这个版本中,我们没有直接把闭包赋给数组,而是定义了一个匿名函数,并将立即执行的这个结果返回给数组。这里的匿名函数有一个参数num,也就是最终函数要返回的值。在调用每个匿名函数时,我们就传入了

    变量i。由于函数参数是按值传递的,所以就将i的当前值赋值给每个参数num;而在这个函数内部,又创建了一个返回num的闭包。这样一来,result数组中每个函数都有自己的num变量的一个副本。因此就可以返回不同的

    数值了。

     还有一个经典的例子看高三182页。

  • 相关阅读:
    java如何使用注解实现分布式锁详解
    Redis集群方案详解
    Redis缓存详解
    Redis的数据类型和应用场景详解
    Redis IO多路复用技术及epoll实现原理详解
    Redis分布式锁的实现原理详解
    Redis 如何实现库存扣减操作?如何防止商品被超卖
    Redis的持久化详解
    20192403赵秋涵 202120222 《网络与系统攻防技术》实验八实验报告
    原型与原型链
  • 原文地址:https://www.cnblogs.com/qianxinxu/p/6117300.html
Copyright © 2020-2023  润新知