代码改变世界

Javascript匿名函数

2012-04-21 13:20  Wid纬度  阅读(1874)  评论(0)    收藏  举报

ü  定义

匿名函数的定义非常简单:就是没有名字的函数。但是其用途非常的大

ü  典型的函数定义方式

在看匿名函数之前我们先看下在Javascript中定义一个函数比较典型的几种方式

  1. 函数声明
    function functionName(args) {
    //函数体
    }
  2. 函数表达式
    var functionName = function (args) {
        //函数体
    }

函数声明与函数表达式的区别:

  1. 函数声明会在任何代码执行以前被加载到作用域
  2. 函数表达式则是在代码执行到那一行的时候才会有定义

例如:

  <script language="javascript" type="text/javascript">
        func1(); //已加载
        function func1() {
            alert('已加载');
        }
        alert(func2);//undefined
        var func2 = function () {
            alert("还未加载");
        }
        func2(); //还未加载
    </script>

那么在函数声明会给函数指定一个名字,而函数表达式则是创建一个匿名函数,原后将函数赋值一个变量,这个变量就指向了这个函数。

ü  匿名函数常用调用方式

定义一个匿名函数如下:

function(x, y, z) {
      return x + y + z;
}

   以上匿名函数没有名字,那么谁也不可能调用这个函数,因为没有指向这个函数的指针,我们可以像下面这样的方式调用匿名函数

  1. 直接调用
    var result = function (x, y, z) {
          return x + y + z;
    }(1,2,3)
  2. 将函数赋值给变量(如上函数表达式方式)

Javascript中允许有两种方式调用函数,第一种就是典型的函数调用:函数名(函数参数列表),另一种方式是将函数作为表达式:(用函数作为表达式)(参数列表)

比如上例中可以这样调用

1.    (func1)()
2.    ( function (x, y, z) { return x + y + z; })()

 

ü  匿名函数的常用法

    1:四则运算

      /* 四则运算 */
        var fourOperations = function (fn, x, y) {
            return fn(x, y);
        }
        var add = function (x, y) {
            return x + y;
        }
        alert(fourOperations(add, 10, 20));

        alert(fourOperations(function (x, y) {
            return x * y;
        }, 10, 20));

2:复杂对象数组的排序

在看复杂对象排序之前我们先来看下简单的数组排序

a.简单数组排序

        /* 数组排序 */
        var person1 = ["cnblog", "abc", "def", "cx"];
        person1.sort();
        alert(person1);

        在默认情况下,sort排序按升序排列数组项,排序过程中首先会调用项的toString()方法,原后比较得到的字符串。

 

        b.复杂数组排序

     /* 定义复杂对象 */
        function Person(name, age) {
            this.name = name;
            this.age = age;
        }
        Person.prototype.toString = function () {
            return "name: " + this.name + " age: " + this.age;
        }
        /* 初始化数组 */
        var person = [new Person("cnblog", 25),
        new Person("abc", 30), new Person("def", 26), new Person("cx", 31)];

        /* 直接使用匿名函数来进行排序 */
        person.sort(function (value1, value2) { return value1.name > value2.name ? 1 : -1; });

        alert(person);

        /* 改进排序方式 */
        person.sort(sortFunction("age"));

        alert(person);

        //        function showSortResult(person) {
        //            var result = "";
        //            for (var i = 0, length = person.length; i < length; i++) {
        //                result += ("name:" + person[i].name + " age:" + person[i].age + "\r\n");
        //            }
        //            alert(result);
        //        }

        function sortFunction(property) {
            return function (value1, value2) {
                return value1[property] > value2[property] ? 1 : -1;
            }
        }

     对于复杂对象的操作在实际应用中是相当常见的,例如在对json对象进行排序时就可以使用上面的方法。

    3.利用匿名函数构建“块级作用域”,这个留着在讲作用域时再细讲

当然匿名函数的作用很多,也欢迎大家分享自己的一些实战经验

 

注:第一篇技术文章,多支持