在JavaScript中,call、apply和bind是Function對象自帶的三個方法,都是爲了改變函數體內部 this 的指向。 apply 、 call 、bind 三者第一個參數都是 this 要指向的對象,也就是想指定的上下文;apply 、 call 、bind 三者均可以利用後續參數傳參; call和apply的返回值是當即調用的,bind是延遲調用的數組
一、call()例子bash
function f(){
console.log(this)
console.log(arguments)
}
var obj={
f
}
var fn =obj.f
obj.f()//這裏的this指向的是obj
fn()//指向的是window
fn.call(context,1,2,3,4,5)
第一個參數是用來改變函數執行時內部this指向的
第二個參數及以後的參數 都是傳給fn函數的實參
複製代碼
對於 apply、call 兩者而言,做用徹底同樣,只是接受 參數 的方式不太同樣。call 是把參數按順序傳遞進去,而 apply 則是把參數放在數組 裏。app
二、apply()例子函數
function fn() {
console.log(this);
console.log(arguments);
}
fn.apply(obj,[1,2,3,4,5,6]);
// apply 的第二個參數,是一個 數組或者類數組;
// 傳參時, 雖然是以一個總體的形式傳給了fn;但 fn接收時
// 仍是分開接收的;
複製代碼
bind() 方法會建立一個 新函數,稱爲綁定函數,當調用這個綁定函數時, 綁定函數會以建立它時傳入 bind() 方法的第一個參數 做爲 this,傳入 bind() 方法的 第二個以及之後的參 數加上綁定函數運行時自己的參數按照順序做爲原函數的參數來調用原函數。ui
三、bind()例子this
// bind 的用法 形式上跟 call 同樣
var obj = {name:'zf'};
function fn() {
console.log(this);
console.log(arguments);
}
var res1 = fn.call(obj,1,2,3,4,5,6);
var res2 = fn.bind(obj,1,2,3,4,5,6);
// bind 不會讓函數當即執行
// 他的返回值是一個 改變後的函數
複製代碼
代碼誠難得,搬磚價更高spa
歡迎留言交流code