将函数作为值传递给另一个函数
function sum(num) {
return num+10;
}
function mm(sum,num) {
return sum(num);
}
console.log(mm(sum,10));
函数内部属性
arguments
一个类数组的对象,但是不是一个数组
arguments的callee属性:这个属性是一个指针,指向的是拥有这个argumnets对象的函数
function box(m) {
if(m<=1){
return 1;
}
else {
return m*arguments.callee(m-1);
}
}
console.log(box(5)); //120
this
this引用的是函数据以执行操作的对象。或者说函数当前执行的那个作用域
window对象和this对象
var color="sasa";
console.log(this.color);
console.log(window.color);
函数的prototype属性
每一个函数都有prototype,每一个prototype都有这两个方法
prototype:保存所有实例方法的真正所在。这个属性有以下两个方法:
1、apply 第一个参数是作用域 第二个是数组(或者arguments)
2、call 第一个参数是作用域,后边的参数是一个一个传递和数组不同
以上两个方法的的第一个功能:
是冒充其他函数执行
上面两个方法都实现的是冒充其他函数执行的功能
function box(num1,num2) {
return num1+num2;
}
function sum(num1,num2) {
return box.apply(this,[num1,num2]);
}
console.log(sum(10,20)) //30
第二种
function box(num1,num2) {
return num1+num2;
}
function sum(num1,num2) {
//而不是box.prototype.apply
return box.apply(this,arguments);
}
console.log(sum(10,20)) //30
2、第二个功能
apply和call经常使用的地方是扩展函数赖以运行的作用域
var color="绿色的";
var box={
color:"红色的"
}
function sayColor() {
console.log(this.color);
}
sayColor.call(this); //绿色的
sayColor.call(box);//红色的
第一句冒充了window的运行环境
第二句冒充了box的运行环境。
使用call和apply来扩充作用域的最大好处是,就是对象不与方法发生任何耦合的关系,为程序的维护提供了方便性