首页 > 代码库 > 第7章 函数表达式

第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;

}

第7章 函数表达式