最直白的call apply bind 使用区别
创建一个函数,及一个空对象,同时使用call apply bind来操作改变函数内部的this指向,并给该函数传入参数
var obj = {}
function test (x, y) {
console.log(x)
console.log(y)
console.log(this)
}
test.call(obj, 2, 3) // call方法在使用时会直接调用
// 控制台会打印出2、3、object
test.apply(obj, [2, 3]) // apply方法在使用时会直接调用
// 控制台会打印出2、3、object
test (2, 3)
// 控制台会打印出2、3、window
let bind = test.bind(obj) //不会直接调用,但是会生成新的函数
bind(2, 3)
// 控制台会打印出2、3、object
```
1、在使用call apply 时,一边会改变this指向,同时也会调用该函数,但原函数不会发生改变,
所以执行原函数:test(2, 3)的this还是指向的window
2、而使用bind是需要重新用一个变量去等于bind(),不会立即执行,需要手动执行,
如:let bind = a.bind(obj)
bind()
如果是call或者apply也去这么写的话就会报错: var c = a.call(obj) //会报错,不能新命名
```
call与apply的区别是如果需要给原函数去传参时,apply是以数组的形式去传入参数,比如本例中的: test.apply(obj, [2, 3])。而call则是直接传入,如:test.call(obj, 2, 3)
说白了就是 apply()把参数打包成Array再传入;call()则是把参数按顺序传入。