zoukankan      html  css  js  c++  java
  • 《JS权威指南学习总结--8.4 作为值的函数》

    内容要点:

      函数可以定义,也可以调用,这是函数最重要的特性。函数定义和调用是JS的词法特性,对于其他大多数编程语言来说也是如此。然而在JS中,函数不仅仅是一种语法,也是值,也就是说,可以将函数赋值给变量,存储在对象的属性或数组的元素中,作为参数传入另外一个函数等。

     一.理解JS中的函数

          定义一个函数:function square(x) { return x*x;}

          这个定义创建了一个新的函数对象,并将其赋值给变量square。函数的名字实际上是看不见的,它仅仅是变量的名字,这个变量指代函数对象。函数还可以赋值给其他的变量,并且仍可以正常工作。

         var s = square; //现在s和square指代同一个函数

         square(4);  //=>16

         s(4);   //=>16

         除了可以将函数赋值给变量,同样可以将函数赋值给对象的属性。当函数作为对象的属性调用时,函数就称为方法:

         var o = { square:function(x){ return x*x;}}; //对象直接量

         var y = o.square(16);

         函数甚至不需要带名字,当把它们赋值给数组元素时:

          var a = [ function(x){ return x*x; },20]; //数组直接量

          a[0](a(1)); //=>400

          最后一句代码看起来很奇怪,但的确是合法的函数调用表达式!

       例如:

          //将函数用做值

          //在这里定义一些简单的函数

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

            function subtract(x,y){ return x-y; }

            function multiply(x,y){ return x*y; }

           function divide(x,y){ return x/y; }

          //这里的函数以上面的某个函数作为参数

         //并给它传入两个操作数然后调用它

           function operate( operator,operand1,operand2 ){ return operator(operand1,operand2); }

         //这行代码所示的函数调用了实际上计算了(2+3)+(4*5) 的值

          var i = operate( add,operate(add,2,3),operate(multiply,4,5));

       

        //我们为这个例子重复实现一个简单的函数

       //这次实现使用函数直接量,这些函数直接量定义在一个对象直接量中

       var operators = {

               add:function(x,y){ return x + y; },

               subtract:function(x,y){ return x-y; },

               multiply:function(x,y){ return x*y; },

               divide:function(x,y){ return x/y },

               pow:Math.pow  //使用预定义的函数

    };

         //这个函数接收一个名字作为运算符,在对象中查找这个运算符

         //然后将它作用于所提供的操作数

         //注意这里调用运算符函数的语法

          function operate2( operation,operand1,operand2 ){

              if(typeof operators[operation] === "function" )

                  return operators[operation](operand1,operand2);

              else

                throw "unknown operator"

             }

            //这样来计算("hello" + "" +"world")的值

            var j = operate2("add","hello",operator2("add"," ","world"));

           //使用预定义的函数Math.pow()

            var k = operator2("pow",10,2);

    二.自定义属性

         JS中的函数并不是原始值,而是一种特殊的对象,也就是说,函数可以拥有属性。

         当函数需要一个 “静态”变量来调用时保持某个值不变,最方便的方式就是给函数定义属性,而不是定义全局变量,显然定义全局变量会让命名空间变得更加杂乱无章。

         比如,假设写一个返回一个唯一整数的函数,不管在哪里调用函数都会返回这个整数。而函数不能两次返回同一个值,为了做到这一点,函数必须能够跟踪它每次返回的值,而且这些值的信息需要在不同的函数调过程中持久化。可以将这些信息存放到全局变量中,但这并不是必需的,因为这个信息仅仅是函数本身用到的。最好将这个信息保存到函数对象的一个属性中。

         例如:

           //初始化函数对象的计数器属性

           //由于函数声明被提前了,因此这里是可以在函数声明之前给它的成员赋值的

          uniqueInteger.counter = 0;

          //每次调用这个函数都会返回一个不同的整数

          //它使用一个属性来记住下一次将要返回的值

           function uniqueInteger(){ return uniqueInteger.counter++; //先返回计数器的值,然后计数器自增1 }

         例子2:函数factorial()使用了自身的属性(将自身当做数组来对待)来缓存上一次的计算结果

             //计算阶乘,并将结果缓存至函数的属性中

              function factorial(n){

                  //isFinite() 函数用于检查其参数是否是无穷大。如果 number 是有限数字(或可转换为有限数字),那么返回 true。否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。

                   if(isFinite(n)&&n>0&&n==Math.round(n)){ //有限的正整数

                        if(!(n in factorial))   //如果没有缓存结果

                              factorial[n]=n*factorial(n-1); //计算结果并缓存之

                         return factorial[n];

                          }

                        else return NaN; //如果输入有误

                    }

                 factorial[1]=1; //初始化缓存以保存这种基本情况

  • 相关阅读:
    Linux常用命令ifconfig的相关信息
    搭建路由实例
    httpclient以json形式参数调用http接口并解析返回的报文
    思考(机遇)
    php 对齐方法
    RequireJS简单介绍即使用
    一周小结(2016-06-06~2016-06-12)
    git介绍及使用
    一周小结(2016-05-30~2016-06-04)
    [转] Mou 一个Markdown工具 语法规则文档(最后)
  • 原文地址:https://www.cnblogs.com/hanxuming/p/5821510.html
Copyright © 2011-2022 走看看