this 代表当前this直属的函数所属的对象

call / apply

  • callapply都是用来直接指定this的值,其中第一个参数就是this(区别不过是apply是用数组的形式来写),并且都是直接就调用了该函数

    • 示例如下:

      1. let obj = {
      2. fn(a, b) {
      3. return a+b
      4. }
      5. }
      6. obj.fn(1, 2) // 这是直接写法(隐式传递),会传递默认的this
    • 改写成call、apply的写法如下:(默认已经知道上面代码的this就是obj

      1. obj.fn.call(obj, 1, 2)
      2. obj.fn.apply(obj, [1, 2])
  • [x] 代码中的第一个参数obj就是你指定的this

  • [x] 而之前的代码中的this就是obj,所以这两句等价于上面代码的obj.fn(1, 2)

    bind

  • bind却是创建一个新的函数,并没有直接调用函数;等到再调用该函数时,其第一个参数就是指定的this

两种写法:

  • [x] 一种是先将函数创建出来,调用的时候再写参数

    1. obj.fn.bind(obj)(1,2)
  • [x] 另一种是创建函数同时将参数写进去,后面直接调用即可

    1. obj.fn.bind(obj,1,2)()

    三种写法在不需要指定this的时候,第一个参数可以写undefined

    bind会将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 指向的