call与apply()方法
call与apply都可以改变this指向
两者的传参方法不一样
- apply()方法 接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
- call()方法 第一个参数和apply()方法的一样,但是传递给函数的参数必须列举出来。
f1.call(null, 10, 30);
f1.apply(null, [100, 200]); //如果为null或者不传 则默认为window
f1.call(obj, 10, 20);
f1.apply(obj, [100, 200]);// 此时,f1函数的指向变成了obj的
也可以用来改变方法this中的指向
per.eat.call(stu); //现在per里面的eat方法中的this就是stu
bind()方法
bind():只是绑定的时候改变this,不是在调用的时候改变this
bind是长期将this绑定,call与apply方法都是临时绑定
可以在复制的时候传参,也可以在啊复制之后调用的时候传参
总结
总结
① 传递的参数不多的时候,使用fn.call(需要指向的对象, 参数1, 参数2, ..., 参数n)
② 传递的参数较多的时候,使用fn.apply(需要指向的对象, [参数1, 参数2, ..., 参数n])
③ 只想将函数长期的绑定给某一个对象使用,使用fn.bind(需要指向的对象, 参数1, 参数2, ..., 参数n)
函数中的几个主要成员
function f1(x, y) {
console.log(f1.arguments.length);// 实参的个数
console.log(f1.length);// 形参的个数
console.log(f1.name);// 函数名
console.log(f1.caller);// f1的调用者是f2
}
f1.name = "fff";// 不能修改
f1(10, 20, 30, 40);
function f2() {
f1(1, 2);
}
f2();
console.dir(f1);
函数可以作为另一个函数的变量来进行传参
既可以传匿名函数也可以传命名函数,在使用函数变量时应该用函数的方法来使用
函数也可以作为返回值来使用
// 数组排序 A < Z < a < z
var arr = ["A", "a", "b", "z", "Z", "C"];
arr.sort(function(a, b) {
// var a = a.toLowerCase();
// var b = b.toLowerCase();
if(a > b) {
return 1;
}else if(a == b) {
return 0;
}else {
return -1;
}
})
console.log(arr);