zoukankan      html  css  js  c++  java
  • 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页。

  • 相关阅读:
    vue 实现返回上一页不请求数据keep-alive
    vue+webpack 实现懒加载的三种方式
    深度解析使用CSS单位px、em、rem、vh、vw、vmin、vmax实现页面布局
    vue2.0中 怎么引用less?
    vue 自定义 提示框(Toast)组件
    Flex 布局教程实例
    Vue.js经典开源项目汇总
    Vue插件编写、用法详解(附demo)
    vue 项目 使用sass以及注意事项
    vue2.0+vue-video-player实现hls播放的案例
  • 原文地址:https://www.cnblogs.com/qianxinxu/p/6117300.html
Copyright © 2011-2022 走看看