在JavaScript中用function关键字来定义一个函数,然而在JavaScript中,函数实际上是对象,每个函数都是Function类型的实例,函数仍然有属性和方法,函数名实际上是一个指向函数对象的指针。
一:在JavaScript中定义函数有3种方式:
function sum(num1,num2){
return num1+num2;
}
var sum=funtion(num1,num2){
return num1+num2;
}; //匿名函数的定义时要赋值给变量,最后要加上;
//第三种方式是使用Funtion的构造函数,这种方式不推荐使用
var sum=new Function("num1","num2","retrun num1+num2");
如果有如下代码:
function sum(num1,num2){
因为使用不带圆括号的函数名是访问哈书指针并非调用函数,所以此时的anotherSum也是指向了同一个函数。
return num1+num2;
}
var anotherSum=sum;
由于在JavaScript中的函数名是作为函数指针的作用的,所以ECMAScript中没有函数重载!
//作为返回值的函数
var box=function(sum,num){
return sum(num);
}
function sum(num){
return num+10;
}
var result=box(sum,10);
alert(result);
二:函数的内部属性:在函数的内部,有两个特殊的对象,arguments和this。
1.arguments是一个类数组对象,包含传入函数中的所有参数,主要用于保存函数的参数,但是这个对象还有一个callee的属性,该属性是一个指针指向拥有这个arguments的对象的函数。
例如:
function box(num){
if(num<=1)
return 1;
else{
return num*arguments.callee(num-1);
}
}
alert(box(10));
2.this指代的是当前作用域下面的对象,当调用全局函数时,this就是window。
window是一个Object类型的对象,并且是JS里面最大的对象,最外围的对象
如果在代码中定义全局变量:var color=”红色的”;那么此时的color就是window对象的一个属性。
window.color="红色的";等价于:var color="红色的";
3.每一个函数对象,都有两个已经确定的属性:length返回函数参数的个数;prototype属性有两个方法:apply(),call();每一个函数都包含这两个非继承而来的函数:
apply():方法实现了调用已经定义的方法来执行
function box(num1,num2){
return num1+num2;
}
function sum(a,b){
return box.apply(this,[a,b]); //this表示的是window作用域,[]表示传递的参数(当然可以只传入arguments来传递参数)
}
function sum(a,b){
return box.call(this,a,b); //this表示的是window作用域,
}
alert(sum(10,20));
总之:call()和apply()两个方法扩充了对象的作用域,降低了对象与方法之间的耦合程度。