【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