三種調(diào)用方式如下:
fn.apply(obj, [arr1,arr2, ...arrN])
fn.apply(null,[1,2]); // this指向window
fn.apply(undefined,[1,2]); // this指向window
apply接受兩個(gè)參數(shù)线椰,第一個(gè)參數(shù)是this的指向胞谈,第二個(gè)參數(shù)是函數(shù)接受的參數(shù),以數(shù)組的形式傳入
改變this指向后原函數(shù)會(huì)立即執(zhí)行憨愉,且此方法只是臨時(shí)改變this指向一次
fn.call(obj, arr1,arr2, ...arrN)
fn.call(obj,1,2); // this會(huì)變成傳入的obj呜魄,傳入的參數(shù)必須是一個(gè)數(shù)組;
fn(1,2) // this指向window
fn.call(null,[1,2]); // this指向window
fn.call(undefined,[1,2]); // this指向window
call方法的第一個(gè)參數(shù)也是this的指向莱衩,后面?zhèn)魅氲氖且粋€(gè)參數(shù)列表
跟apply一樣,改變this指向后原函數(shù)會(huì)立即執(zhí)行娇澎,且此方法只是臨時(shí)改變this指向一次
function fn(...args){
console.log(this,args);
}
let obj = {
name:"許由"
}
fn.bind(obj, arr1,arr2, ...arrN)
const bFn = fn.bind(obj); // this 也會(huì)變成傳入的obj 笨蚁,bind不是立即執(zhí)行需要執(zhí)行一次
bFn(1,2) // this指向obj
fn(1,2) // this指向window
bind() 傳參數(shù)值有兩種方式
1. 直接傳值
f.bind('obj', 1, 2, 3, 4);
2.二次傳值
var bbdd = f.bind('obj', 1, 2);
bbdd(3, 4)
bind方法和call很相似,第一參數(shù)也是this的指向,后面?zhèn)魅氲囊彩且粋€(gè)參數(shù)列表(但是這個(gè)參數(shù)列表可以分多次傳入)
改變this指向后不會(huì)立即執(zhí)行括细,而是返回一個(gè)永久改變this指向的函數(shù)
小結(jié)
從上面可以看到伪很,apply、call奋单、bind三者的區(qū)別在于:
- 三者都可以改變函數(shù)的this對(duì)象指向
- 三者第一個(gè)參數(shù)都是this要指向的對(duì)象锉试,如果沒有這個(gè)參數(shù)或參數(shù)為undefined或null,則默認(rèn)指向全局window
- 三者都可以傳參览濒,但是apply是數(shù)組呆盖,而call是參數(shù)列表,且apply和call是一次性傳入?yún)?shù)贷笛,而bind可以分為多次傳入
- bind 是返回綁定this之后的函數(shù)应又,apply 、call 則是立即執(zhí)行