代码改变世界

闭包N个作用

2012-04-10 15:26  刘联东  阅读(182)  评论(0编辑  收藏  举报

闭包作用域是一只很难驯服的野兽

一个函数的作用域取决于其定义的地方(户口按出生地原则),因此导致了很多诡异的技巧。

1. js 类继承中的闭包作用域

function A(){

 var num  = 0;

}

p = new A();

function B(){}

B.prototype = p;

这样B在构造子类的时候实际上只调用了A的构造函数一次。这样A的所有子类共享一个原型空间(即p的私有空间)。 公开变量和方法则会被重构。

如果要避免这种情况可以让B构造子类的时候重构一个原型空间,即指定

B.constructor = A;

2. 闭包提高数据安全性

闭包可以将处理的方法和属性隐藏,可以提高属性的安全性,只对外提供必要的函数接口,对数据和实现细节进行隐藏。

function  Collection(elementtType){

  var type = elementtType || Object;

  var arr =  [];

  var check = function(data){

      for(var i=0; i<data.length; i++){

      if(! data instanceof type) TypeError();

  }

  return true;

  }

  this.setArray = function(dv ){

      ( dv instanceof Array) ? (check(dv) && arr =dv ): TypeError();

 }

this.setData(idx , v){

    (v instanceof type) && idx <arr.length && arr[idx] =v || Error();

}

 this.getData = function(){

     return arr;

 }

}

该方法将集合的数组隐藏不允许用户直接需改数组,而且可以将类型检查等机制隐藏在函数内部,即使用户使用属性打印等方法也无法获得实现的细节。

 

3. 闭包异步加载中的使用

    参考:【动态加载JS】

4. 代理模式中的使用

  ....自己发挥相信

联动 互联互动