call / apply
call和apply都是用来直接指定this的值,其中第一个参数就是this(区别不过是apply是用数组的形式来写),并且都是直接就调用了该函数示例如下:
let obj = {fn(a, b) {return a+b}}obj.fn(1, 2) // 这是直接写法(隐式传递),会传递默认的this
改写成
call、apply的写法如下:(默认已经知道上面代码的this就是obj)obj.fn.call(obj, 1, 2)obj.fn.apply(obj, [1, 2])
[x] 代码中的第一个参数
obj就是你指定的this[x] 而之前的代码中的
this就是obj,所以这两句等价于上面代码的obj.fn(1, 2)bind
而
bind却是创建一个新的函数,并没有直接调用函数;等到再调用该函数时,其第一个参数就是指定的this
两种写法:
[x] 一种是先将函数创建出来,调用的时候再写参数
obj.fn.bind(obj)(1,2)
[x] 另一种是创建函数同时将参数写进去,后面直接调用即可
obj.fn.bind(obj,1,2)()
三种写法在不需要指定
this的时候,第一个参数可以写undefinedbind会将this绑死,不能再改变this
```javascript let obj = {name: ‘jack’} let obj2 = {name: ‘frank’} function sayName(){ console.log(this.name) }
let f1 = sayName.bind(obj)() // jack let f2 = sayName.call(obj2) // frank let f3 = sayName.bind(obj).call(obj2) // jack ```
- 上面代码中最后一行,先 bind 再 call ;结果 this 还是 bind 指向的 this,而不是 call 指向的
