call() 、 apply() 梁剔、bind()方法的作用和區(qū)別圾浅!
從一開始,我是在書上看到關于bind()憾朴、call() 和 apply(), 不過長久以來狸捕,在工作中與網(wǎng)上接觸到了很多關于這三個方法的使用場景,對這三個方法也算是比較熟悉了众雷。所以把他們的作用和區(qū)別簡單闡述一下灸拍!
javaScript權威指南上的解釋是: call() 、apply()可以看作是某個對象的方法砾省,通過調用方法的形式來間接調用函數(shù)鸡岗。bind() 就是將某個函數(shù)綁定到某個對象上。
關于call() 和 apply() 在犀牛書上的解釋可能比較生澀難懂编兄,我的理解就是轩性,它們的作用是: 讓函數(shù)在某個指定的對象下執(zhí)行。
例:
var obj = {x: 1}
function foo() {console.log(this.x)}
foo.call(obj)? ? ? //打印結果: 1
call() 和apply()的第一個參數(shù)相同狠鸳,就是指定的對象揣苏。這個對象就是該函數(shù)的執(zhí)行上下文悯嗓。
call()和apply()的區(qū)別就在于,兩者之間的參數(shù)卸察。
call()在第一個參數(shù)之后的? 后續(xù)所有參數(shù)就是傳入該函數(shù)的值脯厨。apply() 只有兩個參數(shù),第一個是對象坑质,第二個是數(shù)組合武,這個數(shù)組就是該函數(shù)的參數(shù)。
例1:
1
2
3
4
5
6
7
var obj = {};
function foo(a, b, c) {
? console.log(b);
}
foo.call(obj, 1, 2, 3)? //打印結果: 2;
例2:
1
2
3
4
5
6
7
var obj = {};
function foo(a, b, c) {
? console.log(b);
}
foo.apply(obj, [1, 2, 3])? 打印結果: 2;
bind() 方法和前兩者不同在于: bind() 方法會返回執(zhí)行上下文被改變的函數(shù)而不會立即執(zhí)行涡扼,而前兩者是直接執(zhí)行該函數(shù)稼跳。他的參數(shù)和call()相同。
這三個方法的作用都是改變函數(shù)的執(zhí)行上下文吃沪!