Skip to content

JavaScript 中的 call()、apply()、bind() 的用法  #10

@jwchan1996

Description

@jwchan1996

JavaScript 中的 call()、apply()、bind() 的用法

例1

var name = '小陈'
var age = 18

var obj = {
  name: '小猪',
  objAge: this.age,
  fun: function(){
    console.log(this.name + '年龄' + this.age)
  }
}

obj.objAge    //18
obj.fun()    //小猪年龄undefined

例2

var name = 'PDD'
function show(){
  console.log(this.name)
}

show()    //PDD

比较一下这两者 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 show() 函数 thiswindow

call()、apply()、bind() 都是用来重定义 this 这个对象的!

如:

var name = '小陈'
var age = 18

var obj = {
  name: '小猪',
  objAge: this.age,
  fun: function(){
    console.log(this.name + '年龄' + this.age)
  }
}

var boy = {
  name: '朱丽叶',
  age: 16
}

obj.fun.call(boy)   //朱丽叶年龄16
obj.fun.apply(boy)    //朱丽叶年龄16
obj.fun.bind(boy)()   //朱丽叶年龄16

以上除了 bind 方法后面多了个 () 外,结果返回都一致!
由此得出结论,bind 返回的是一个新的函数,你必须调用它才会被执行。

对比call 、bind 、 apply 传参情况下

var name = '小陈'
var age = 18

var obj = {
  name: '小猪',
  objAge: this.age,
  fun: function(a, b){
    console.log(this.name + ' 年龄 ' + this.age, ' 来自 ' + a + '去往' + b)
  }
}

var boy = {
  name: '朱丽叶',
  age: 16
}

obj.fun.call(db,'广州','深圳')     //朱丽叶 年龄 16  来自 广州去往深圳
obj.fun.apply(db,['广州','深圳'])      //朱丽叶 年龄 16  来自 广州去往深圳
obj.fun.bind(db,'广州','深圳')()       //朱丽叶 年龄 16  来自 广州去往深圳
obj.fun.bind(db,['广州','深圳'])()   //朱丽叶 年龄 16  来自 广州,深圳去往undefined

从上面四个结果不难看出 call、bind、apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:

  • call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面 obj.fun.call(db,'成都', ... ,'string')

  • apply 的所有参数都必须放在一个数组里面传进去 obj.fun.apply(db,['成都', ..., 'string'])

  • bind 除了返回是函数以外,它的参数和 call 一样

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions