js中call, apply, bind的自我心得
阿新 • • 發佈:2018-12-12
apply 和 call 的區別
apply和call: apply和call作用相同,只是在傳參上面有點小差別,兩個方法一個是將呼叫函式中的引數放在一個數組中傳過去,一個是一個一個傳過去。 這裡用apply方法做講解,apply方法傳入兩個引數:一個是作為函式上下文的物件,指的是呼叫這個apply方法的函式,他的函式內部this由你傳過來的物件代替了,另外一個是作為函式引數所組成的陣列。
例項:
var obj = { name : 'linxin' } function func(firstName, lastName){ console.log(firstName + ' ' + this.name + ' ' + lastName); } func.apply(obj, ['A', 'B']);
解析:這裡func函式呼叫了apply方法,將obj和一個數組當做兩個引數,此時func函式中的this已經指向obj物件了,所以func函式中的this.name變成了obj.name, 控制檯將會輸出 A linxin B
apply 和 call 的用法
1,改變this指向: 改變呼叫函式中this的指向,預設引數為this
2,借用別的物件的方法:
例子:
var Person1 = function () { this.name = 'linxin'; } var Person2 = function () { this.getname = function () { console.log(this.name); } Person1.call(this); } var person = new Person2(); person.getname();
解析:Person1.call(this)的意思是把Person2函式內的this傳到Person1函式內,這樣Person1函式內的this.name = ‘linxin’就代表著Person2函式內中寫了this.name = ‘linxin’,這樣Person2函式就多了一個name的屬性,類似java中的extend繼承
3,呼叫函式
apply、call 方法都會使函式立即執行,因此它們也可以用來呼叫函式
function func() { console.log('linxin'); } func.call(); // linxin
call 和 bind 的區別
在 EcmaScript5 中擴充套件了叫 bind 的方法,在低版本的 IE 中不相容。它和 call 很相似,接受的引數有兩部分,第一個引數是是作為函式上下文的物件,第二部分引數是個列表,可以接受多個引數。 它們之間的區別有以下兩點
1.bind 發返回值是函式
var obj = { name: 'linxin' } function func() { console.log(this.name); } var func1 = func.bind(obj); func1(); // linxin
2.引數的使用
function func(a, b, c) { console.log(a, b, c); } var func1 = func.bind(null,'linxin'); func('A', 'B', 'C'); // A B C func1('A', 'B', 'C'); // linxin A B func1('B', 'C'); // linxin B C func.call(null, 'linxin'); // linxin undefined undefined
call 是把第二個及以後的引數作為 func 方法的實參傳進去,而 func1 方法的實參實則是在 bind 中引數的基礎上再往後排