函数类型的理解

来源:互联网 发布:java oop 编辑:程序博客网 时间:2024/06/11 17:17
Function 类型
function sun(num1,num2){
     return num1+num2;
}
alert(sum(10,10));        //20

var anotherSun=sun;
alert(anotherSun(10,10));  //20

sun=null;
alert(anotherSun(10,10)); //20
以上代码首先定义了一个名为 sun 的函数,用于求两个值的和。然后又声明变量 anotherSun,把 sun 的值赋给 anotherSun,这里注意不带圆括号的函数是访问函数指针。此时,anotherSun 和 sun 都指向同一个函数,因此 anotherSun( ) 也可以被调用并返回结果,尽管把 sun 设置成为 null,但仍然可以调用 anotherSun( )。

没有重载(深入理解)
在同一个环境里,同时声明两个同名函数,后面的函数会覆盖前面的函数。

函数声明与函数表达式
alert(sum(10,10));
function sum(num1,num2){
     return sum1+sum2;   
}    
//20,能够正常运行

alert(sum(10,10));
var sum=function(num1,num2){
     return sum1+sum2;
}
//报错
在浏览器中,解析器向执行环境加载数据时,对函数声明和函数表达式并非一视同仁,解析器会先读取函数声明并添加到执行环境中;至于函数表达式,此时的函数已经赋给一个变量,这个时候的解析器是一行一行往下解析的,在执行到函数所在语句中,根本没有 sum 函数的引用, 第一行就会导致报错,根本不会执行到下一行。除此之外,函数声明和函数表达式语法是等价的。

作为值的函数
function create(propertyName){
     return function(obj1,obj2){
          var value1=obj1[propertyName];
          var value2=obj2[propertyName];
          if(value1<value2){
               return -1;
          }else if(value>value2){
              return 1; 
          }else{
              return 0; 
          }
     };
}
var date=[{name:'Zachary',age:'28'},{name:'Nicholas',age:'29'}];
data.sort(create('name'));
alert(date[0].name);      //Nichoas
data.sort(creae('age'));
alert(data[0].name);     //Zachary
最初在书里看到这个函数,我还是懵的,来来回回看了好几遍才理解。
这里,创建了两个包含两个数组的 data 对象,每个对象有两个属性,对data 使用了 sort( ) 方法,同时调用 create 函数作为 sort( ) 方法的参数来决定次序。
第一个 alert 的‘name’作为参数传进给 create 函数,里面又嵌套了一个函数,value1 保存着 data 数组里第一个对象的 name值 ,value2 保存着数组里第二个对象的 name 值,然后做个 if 判断(这个判断在数组章节有写),按照 name 属性的值进行排序,最后得到的排在第一的是 {name:'Nicholas',age:'29'} 的对象,想也明白,字母顺序表里,N 肯定要比 Z 的顺序靠前。
第二个alert 原理一样,是以 ‘age’值作为依据来判断,最后排在第一个的是 {name:'Zachary',age:'28'} 这个对象,想也明白,在if 判断之后,28 要比 29靠前。

函数内部的属性
function a(num){
     if(num<=1){
          return 1;
     }else{
         return num*arguments.callee(num-1) 
     }
}
var b=a;
a=function(){
     return 0;
}
alert(b(5));  //120
alert(a(5));  //0
第一次看我自己是没看懂这种定义阶乘函数,递归算法,为什么会等于120呢?也是来来回回看了几遍才懂。
arguments.callee 指向的是正在执行的函数。
5<=1,不成立,5*(5-1)=20,将得到的20 return 回去,此时的 num 值已经减1,为4;
4<=1,不成立,20*(4-1)=60,将得到的60 return 回去,此时的 num 值减1,为3;
3<=1,不成立,60*(3-1)=120,将得到的120 return 回去,此时 num 值减1,为2;
2<=1,不成立,120*(2-1)=120,得到120。
后面的就好理解了,把函数 a 赋值给 b,再把函数给返回0,调用 b 得到120,调用 a 得到0。

函数属性和方法
apply( ) 和 call( ) ,这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内 this 对象的值。
这两个方法不同在于接收参数的方式不同,具体就不写了,这两个方法什么强大的是能扩充函数赖以运行的作用域。
还有一个bind( ) 方法,这个方法会创建一个示例,其this值会被绑定传给 bind( ) 函数的值
window.color='red';
var o={color:'blue'};
function sayColor(){alert(this.color)};
sayColor();   //red
sayColor.call(this);   //red
sayColor.call(window); //red
sayColor.call(o);      //blue

var boj=sayColor.bind(o);
boj(); //blue

1 0