• 第7章 函数表达式


    定义函数方式有两种:函数声明,函数表达式

    函数声明有一个重要特征:函数声明提升

    7.1 递归

    function func(num){

      if (num<=1){

        return 1;

      }else{

        return num*func(num-1);

      } 

    }

    这是一个经典的阶乘函数

    arguments.callee式一个指向正在执行的函数的指针,可以代替函数名

    7.2 闭包

    闭包是指有权访问另一个函数作用域中的变量的函数

    闭包只能取得包含函数中任何变量的最后一个值。见p181

    function fn(propertyName){

             return function(object1){

                       var v1 = object1[propertyName]; //访问了外部变量propertyName变量

             }

    }

    由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存,过度使用闭包可能会导致内存占用过多。所以建议只是在绝对必要时再考虑使用闭包。

    7.2.2 关于this对象

     全局函数中,this=window,当函数被当作某个对象的方法调用时,this等于那个对象。匿名函数的执行环境具有全局性,因此对象通常指向window.

    https://zhuanlan.zhihu.com/p/23804247

    7.2.3 内存泄漏

    如果闭包的作用域中保存着一个HTML元素,那么就意味着该元素无法被销毁。

    function assignHandler(){

             var element = document.getElementById(‘someElement’);

             var id = element.id;

             element.onclick = function(){

                       alert(id);

             };

             element = null; //变量设置为null,才能解除对DOM对象的引用,顺利减少引用数,确保正常回收其占用的内存

    }

    7.3模仿块级作用域

    (function(){

      //这是块级作用域

    })();

    上述代码立即调用了一个匿名函数,将函数声明包含在一对圆括号中,表示它实际上是一个函数表达式,后面的圆括号立即调用了这个函数。

    这种方法可以减少闭包占用的内存问题,没有指向匿名函数的引用。

    7.4 私有变量

    任何函数中定义的变量都可以认为是私有变量,包括函数的参数、局部变量和在函数内部定义的其他函数

    function MyObject(){

             //私有变量

             var privateVariable = 10;

             function privateFunction(){

                       return false;

             }

             //特权方法

             this.publicMethod = function(){

                       privateVariable ++;

                       return privateFunction();

             }

    }

    7.4.1静态私有变量

    (function(){

             var privateVariable = 10;

             function privateFunction(){

                      

             }

             Myobject = function(){              

             }

    //公有/特权方法

             Myobject.prototype.publicMethod = function(){

                       privateVariable ++;

                       return privateFunction();

             }

    })()

    这个模式创建了一个私有作用域,并在其中封装了一个构造函数及相应的方法。

    7.4.2模块模式

    单例创建私有变量和特权方法。所谓单例就是只有一个实例的对象。简单的语法如下:

    var singleton = {

             name: value,

             method: function(){

    //这里是方法

    }

    }

    还可以添加私有变量和特权方法

    var singleton = function(){

             //私有变量和私有函数

             var privateVariable = 10;

             function privateFunction(){}

             //特权/公有方法和属性

             return {

             publicProperty: true,

             publicMethod: function(){

             privateVariable++;

             return privateFunction();

    }

    }

    }

    这个模式返回了一个匿名函数,在函数内部,定义私有变量和函数,然后将一个对象字面量作为函数的值返回。返回的对象字面量中只包含可以公开的属性和方法。

    7.4.3增强的模块模式

    var singleton = function(){

             //私有变量和私有函数

             var privateVariable = 10;

             function privateFunction(){

             return false;

    }

    //创建对象

    var object = new CustomType();

    //添加特权/仅有属性和方法

    object.publicProperty = true;

    object.publicMethod = function(){

             privateVariable++;

             return privateFunction();

    };

    return object;

    }

  • 相关阅读:
    Nokia Qt SDK开发环境使用
    iPad不久将能使用Android系统
    原生IDE新军:JRuby阵营的RedCar,JavaScript阵营的Cloud9(自己写个IDE出来一定很复杂吧)
    手机产品的信息架构
    百万开发者拥戴!七大.NET著名开源项目
    Prism 4.0发布最终版,支持Windows Phone 7
    Qt Symbian 开发环境安装
    Qt 4.7.1 和 Mobility 1.1.0 已发布
    WSI闭关,这对WS*意味着什么?(个人觉得Web Services是个好东西)
    ERROR: unknown virtual device name解决方法
  • 原文地址:https://www.cnblogs.com/wwjdx/p/6154686.html
Copyright © 2020-2023  润新知