call
改變函數(shù)的this指向(this改變?yōu)閭魅氲膮?shù)),并且執(zhí)行函數(shù)
function fun(){
console.log(this);
}
fun.call({name:'ouyang'});//{name:'ouyang'};
//可以看出,call的用法就是把前面函數(shù)執(zhí)行并且改變this為傳入的參數(shù)
舉個栗子:
function fn1(){
console.log(1);
}
function fn2(){
console.log(2);
}
fn1.call(fn2);//1
fn1.call.call(fn2);//2(這個暫時理解成fn1.call作一個函數(shù),并執(zhí)行它,執(zhí)行它就是執(zhí)行這個函數(shù)的this,而此時this指向fn2,所以執(zhí)行fn2)
call 、apply方法都是一樣改變this指向,只是在傳遞函數(shù)參數(shù)的時候不一樣
bind es5新規(guī)定的,es5下不兼容(IE6~8)
bind也是改變this的指向,只不過不會立即執(zhí)行
舉個栗子:
function fn(num1,num2){
console.log(num1+num2);
console.log(this);
}
var obj={
name:'ouyang'
}
fn.call(obj,1,2);
//3
// {name:'ouyang'}
fn.apply(obj,[1,2])
//3
//{name:'ouyang'}
//可以看出第一個參數(shù)對象都是一樣的,只是后面?zhèn)鬟f的函數(shù)需要的參數(shù)是,一個是數(shù)值列舉,一個可以直接傳入一個數(shù)組(更簡潔)
//可以看出第一個參數(shù)對象都是一樣的,只是后面?zhèn)鬟f的函數(shù)需要的參數(shù)是,一個是數(shù)值列舉,一個可以直接傳入一個數(shù)組
var temp=fn.bind(obj,1,2);
temp();//現(xiàn)在才會執(zhí)行