JavaScript中闭包的概念及用法

来源:互联网 发布:手机写作软件排行 编辑:程序博客网 时间:2024/06/05 05:51

昨天在<JavaScript高级程序编程>中看到了函数一章, 讲到了关于闭包的概念, 其实闭包说的简单一点就是在一个函数的里面返回另一个函数, 因此返回的函数可以访问外层函数的变量和方法. 这是一种极为有用的技术, 例如有一个对象数组, 我们想要根据某个对象属性对数组进行排序, 而传递给数组sort()方法的比较函数只能接受两个参数, 也就是要比较的值, 可是我们需要一种方式来指明按照哪个属性来排序. 要解决这个问题, 可以定义一个函数, 他接收一个属性名, 然后根据这个属性名来创建一个比较函数, 下面就是这个函数的定义:

  1. function createComparisonFunction( propertyName ){
  2.    return function( obj1, obj2 ){
  3.       var value1 = obj1[ propertyName ];
  4.       var value2 = obj2[ propertyName ];
  5.       if( value1 < value2 ){
  6.          return -1;
  7.       }
  8.       else if( value1 > value2 ){
  9.          return 1;
  10.        }
  11.        else {
  12.           return 0;
  13.        }
  14.    }

实际上这就是在一个函数中嵌套了另一个函数, 而且内部函数前面加了一个return操作符. 在内部函数接收到propertyName参数后, 它会使用方括号表示法来取得给定属性的值, 取得了想要的属性值之后, 定义比较函数就非常简单了.  上面的函数可以像下面例子中这样使用:

  1. var data = [{ name:"Zachary", age: 28 }, { name: "Nicholas", age: 29}];
  2. data.sort( createComparisonFunction("name") );
  3. alert( data[0].name );         //结果是Nicholas
  4. data.sort( createComparisonFunction("age") );
  5. alert( data[0].name );         //结果是Zac;hary

在默认情况下我们会直接使用sort()方法来调用每个对象的toString()方法来排序, 但得到的结果往往是不符合我们的思维习惯. 因此, 我们调用createComparisonFunction("name")方法创建了一个比较函数, 以便按照每个对象的name属性进行排序, 所以结果排在前面的是name为"Nicholas", age为29的对象. 而后面使用createComparisonFunction("age")返回的比较函数则是按照对象的age属性排序, 所以结果排在前面的是name值为"Zachary",age值为28的对象.

0 0