一、函数的声明方式
普通方式
function box(num1, num2){
return num1 + num2;
}
使用’变量初始化函数’
var box = function (num1, num2){
return num1 + num2;
}
使用Function构造函数(不推荐)
var box = new Function('num1','num2','return num1 + num2');
作为值的函数
函数名本身就是变量,所以函数也可以作为值来使用。
function box(sunfunction,num){
return sunfunction(num);
}
function sunfunction(num){
return num + 10;
}
var result = box(sunfunction,10);
document.write(result);
输出:
20
函数内部属性
函数内部有两个特殊的对象,arguments和this.
1、arguments
arguments是一个类数组对象,保存传入函数的所有参数,该对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
一个简单的递归:
function box(num){
if(num <= 1){
return 1;
}else{
return num * box(num-1);
}
}
使用callee代表自身:
function box(num){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num-1);
}
}
2、this
windown是一个对象,而且是JS里面最大的、最外围的对象。
所有的全局变量都是window的属性。
在全局范围内,this就代表的是window。
构造函数中this,代表的是实例本身。
函数的属性和方法
既然函数也是对象,那么函数也可以有属性和方法。每个函数都有两个属性,length和prototype。其中length是函数希望接收的命名参数的个数。prototype属性是保存所有实例方法的真正所在,也就是原型。
prototype下有两个方法,apply()和call(),每个函数都包含这两个非继承而来的方法,其用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
apply和call可以冒充另外一个函数,如以下例子:
function box(num1,num2){
return num1 + num2;
}
function sum(num1, num2){
return box.apply(this,[num1, num2]);
}
function sum2(num1, num2){
return box.apply(this,arguments);// arguments可以当作数组传递
}
function sum(num1, num2){
return box.call(this,num1,num2);//call只是传递参数不用,其他与apply一样
}
事实上传递参数并不是apply()和call()方法真正的用武之地,它们经常使用的地方是能够扩展函数赖以运行的作用域。
var color = "红色的";// 全局
var box = {
color :'蓝色的'// 局部
}
function sayColor(){
document.write(this.color);
}
//sayColor();// 全局,输出'红色的'
sayColor.call(box);// 局部,冒充box,作用域在box对象里,所以就输出'蓝色的'