apply靶庙、call和bind對比
三者異同
- 三者都是用來改變函數(shù)執(zhí)行時的上下文,也就是改變this的指向恨诱。
- call方法傳遞給調(diào)用函數(shù)的參數(shù)是逐個列出來的,而apply第二個以上的參數(shù)則要寫在數(shù)組/類數(shù)組中,bind支持以上兩種寫法
- call和apply直接執(zhí)行了函數(shù)玖绿,而bind返回的是一個綁定上下文的函數(shù),需要調(diào)用才會執(zhí)行
三者用法
-
apply的用法
Function.apply(obj, [arg1, arg2....])
立即執(zhí)行
-
call的用法
Function.call(obj, arg1, arg2....)
立即執(zhí)行
-
bind的用法
// 支持以上兩種寫法 Function.bind(obj, [arg1, arg2....]) Function.bind(obj, arg1, arg2....)
返回一個綁定上下文的函數(shù)叁巨,并且需要調(diào)用斑匪,才會執(zhí)行
三種用法第一個參數(shù)都是是一個對象, 是Function 的調(diào)用者锋勺,將會指向這個對象蚀瘸。如果不傳,則默認(rèn)為全局對象 window
舉個栗子
// call
const obj = {
name: 'danae'
}
function sayHello(args) {
console.log(this.name, args);
}
sayHello.call(obj, 'nice to meet you庶橱!')
// 輸出: danae nice to meet you
// apply
const obj = {
name: 'danae'
}
function sayHello(args) {
console.log(this.name, args);
}
sayHello.apply(obj, ['nice to meet you贮勃!'])
//輸出: danae nice to meet you!
// bind
const obj = {
name: 'danae'
}
function sayHello(args) {
console.log(this.name, args);
}
sayHello.bind(obj, 'nice to meet you苏章!')()
// 或者
const sayHelloFunc = sayHello.bind(obj, 'nice to meet you寂嘉!')
sayHelloFunc()
// 輸出: danae nice to meet you!