window.firstName = "li_";
window.lastName = "tao";
var myObject = {firstName:'my', lastName:'Object'};
function getName(){
console.log(this.firstName + this.lastName);
}
function getMessage(sex,age){
console.log(this.firstName + this.lastName + " 性别: " + sex + " age: " + age );
}
getName.call(window); // li_tao
getName.call(myObject); // myObject
getName.apply(window); // li_tao
getName.apply(myObject);// myObject
getMessage.call(window,"女",21); //li_tao 性别: 女 age: 21
getMessage.apply(window,["女",21]); // li_tao 性别: 女 age: 21
getMessage.call(myObject,"未知",22); //myObject 性别: 未知 age: 22
getMessage.apply(myObject,["未知",22]); // myObject 性别: 未知 age: 22
1 call和apply方法传入的第一个参数,改变了原调用方法的作用域;原调用方法的this指向了call方法第一个参数对象;
2 call和apply的用法区别在于,call可以从第二个位置开始传入多个参数;
apply只能在第二个参数位置传入一个数组类型的参数;
call & apply & bind
call就是挨个传值,apply传一个数组,bind也是挨个传值,但和call和apply还有一些不同,使用call和apply会直接执行这个函数,而bind并不直接执行,而是将绑定好的this重新返回一个新函数,什么时候调用由你自己决定。
function fn(a,b,c,d){
console.log(a,b,c,d);
}
//call
fn.call(null,1,2,3);
//apply
fn.apply(null,[1,2,3]);
//bind
var f = fn.bind(null,1,2,3);
f(4);
结果如下:
1 2 3 undefined
1 2 3 undefined
1 2 3 4