【JS】引用类型之Function

定义方法

//方法1:推荐
function sum(value1,value2){

}

//方法2:不推荐
//原因:如果有调用此方法的代码在这个定义之前就会调用不到(未读取到内存)这个函数而报错,这跟javascript的读取引擎有关
var sum = function(value1,value2){

}

//方法3:不推荐,在Safari中会导致错误
var sum = function sum(value1,value2){

}

//方法4:不推荐
var sum = new Function("num1","num2","rturn num1+num2");

 

函数是没有重载的,后面定义的会覆盖前面定义的

function sum(num1,num2){
    alert(num1 + num2);
}
function sum(num1,num2,split){
    alert(split + "," + (num1+num2))
}
sum(1,2);//undifined,3

 

函数的内部属性

arguments属性,是一个保存入参的数组对象,但其有一个callee的属性指向拥有arguments属性的函数

function factorial(num){
      if (num <= 1) {
         return 1;
      } else {
         return num * arguments.callee(num-1);
        //等同于  return num * factorial(num-1);  但是上面的方法更灵活,不受函数名更改的影响,消除了耦合
      }
}

var trueFactorial = factorial;
        
factorial = function(){
            return 0;
};
        
alert(trueFactorial(5));   //120  递归运算
alert(factorial(5));       //0

this属性

指向该function的拥有者,如果是全局函数this则指向window对象

window.color = "red";
var o = { color: "blue" };
        
function sayColor(){
      alert(this.color);
}
        
sayColor();     //red
        
o.sayColor = sayColor;
o.sayColor();   //blue

caller属性

该属性保存调用的函数的引用,如果是在window环境下该属性值为null

function outer(){
       inner();
}
        
function inner(){
     alert(arguments.callee.caller);//调用了outer.toString()
}
        
outer();//弹出outer的定义的源代码

 

函数的外部属性和方法

外部属性

1、length:表示函数希望接受的参数的个数

2、prototype:保存着函数的例如valueOf()等函数,只是访问方式是function.valueOf()而已,并且这个属性里的信息是不可以被枚举

 

apply方法

function sum(num1, num2){
            return num1 + num2;
}
        
function callSum1(num1, num2){
            return sum.apply(this, arguments);//传入arguments对象
}
        
 function callSum2(num1, num2){
            return sum.apply(this, [num1, num2]);//传入数组
}
        
alert(callSum1(10,10));   //20
alert(callSum2(10,10));   //20  

call方法

作用跟apply是一样的,只是接收参数的方式不一样,第一个是参数是执行环境对象,其余的参数必须逐个列举出来传递给函数

function sum(num1, num2){
    return num1 + num2;
}
function callSum(num1, num2){
    return sum.call(this, num1, num2);
}
        
alert(callSum(10,10));   //20

apply和call方法的强大之处并非简单的传值调用,而是在于动态的改变函数的运行环境(也就是函数的内部属性this的值)

window.color = "red";
var o = { color: "blue" };
        
function sayColor(){
    alert(this.color);
}
        
sayColor();            //red

//调用apply方法一样
sayColor.call(this);   //red
sayColor.call(window); //red
sayColor.call(o);      //blue

bind方法

动态改变方法的内部属性this的值

window.color = "red";
var o = { color: "blue" };
                           
function sayColor(){
            alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor();   //blue
posted @ 2013-04-11 14:54  自行车上的程序员  阅读(1078)  评论(0编辑  收藏  举报