要想記得牢,首先要記住它存在的目的。
在javascript OPP中,咱們常常這樣定義:javascript
function person(){} person.prototype = { name: 'jack', say: function(){ console.log('my name is' + this.name) } } var goodPerson = new person() goodPerson.say() // 打印 my name is jack
如今有一個對象dog = {name:'wangwang'}
,這條狗也想會說話(擁有say方法),那麼咱們能夠這樣goodPerson.say.call(dog)
這樣dog就能夠說話了。java
var dog = { name:'wangwang' } goodPerson.say.apply(dog) // my name is wangwang 或 goodPerson.say.call(dog) // my name is wangwang
能夠看出call和apply是爲了動態改變this而出現的,若是一個object沒有某個方法,而別的object有,那麼就用得上call和apply了。
那call 和 apply有什麼區別呢?
請看下邊這個例子:app
function add (a = 1, b = 1) { return a + b } function sub (a = 1, b = 1) { return a - b } add() // 2 sub() // 0 add.call(sub, 2, 2) // 4 add.apply(sub,[2,2]) // 4 sub.call(add, 3, 2) // 1 sub.apply(add, [3, 2]) // 1
so,很容易就能夠看出call和apply的區別就是傳參數的方式不一樣。this