您的位置:首页 > Web前端 > JavaScript

【JS】引用类型之Function

2013-04-11 14:54 405 查看
定义方法

//方法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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: