JS:指定this三兄弟之call、apply、bind

大家好,我是梅巴哥er。本篇就讲讲用于绑定this的三兄弟------call、apply、bind。


call

call的语法

function.call(thisArg, arg1, arg2, ...)

call语法解释

就是用thisArg, arg1, arg2, …这些参数,来调用call前面的function。
call() 提供新的 this 值给当前调用的函数/方法。

其中:

  • thisArg 不是必须的。如果这个函数是非严格模式下,thisArg是null或undefined,则指向全局对象。
  • arg1, arg2, …这些都是传入function的实参。
call的返回值

使用调用者提供的 this 值和参数调用该函数的返回值。若该方法没有返回值,则返回 undefined。


call代码举例
// example1
function A(name, age) {
    
    
    this.name = name 
    this.age = age 
    this.sayHi = function() {
    
    
        console.log('Athis: ', this) // 查看A的this指向
    }
}
function B() {
    
    
    A.call(this, '迪丽热巴', 18)
    console.log(this) // 查看this指向情况
}
var dili = new B()
console.log(dili.name + '今年' + dili.age + '岁了')
var a = new A()
a.sayHi()
// 输出:B { name: '迪丽热巴', age: 18, sayHi: [Function] }
// 迪丽热巴今年18岁了
// Athis:  A { name: undefined, age: undefined, sayHi: [Function] }
// call指定了参数B的this,call给A提供了新的this值
// B通过this和另外两个参数,调用了函数A
// B此时继承了A的属性,所以call可以实现继承
// A.call(),A必须是function类型,不能是其他类型。

再来看一个例子

function a(age) {
    
    
    console.log('hi, ', this.name + age + '岁了')
    console.log(this)
}
obj = {
    
    
    name: '迪丽热巴'
}
a.call(obj, 18)
// 输出:hi,  迪丽热巴18岁了  { name: '迪丽热巴' }
// obj和参数18通过call调用了函数a
// call给a提供了新的this值obj

apply


apply语法

func.apply(thisArg, [argsArray])

  • thisArg是必选项。
  • [argsArray]是数组
  • apply() 方法和call()方法的作用类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组

bind


bind()方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。


bind返回值

返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。


bind在项目中常被用来绑定事件函数的this指向。

但是在用了箭头函数后,就不需要用bind绑定了。


bind绑定事件的例子

    // 为了在回调中使用 `this`,这个绑定是必不可少的
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    
    
    this.setState(state => ({
    
    
      isToggleOn: !state.isToggleOn
    }));
  }

这个例子可以这样改造:

// 这样就不需要再单独绑定this了
handleClick = () => {
    
    
    this.setState(state => ({
    
    
      isToggleOn: !state.isToggleOn
    }));
  }

以上。

猜你喜欢

转载自blog.csdn.net/tuzi007a/article/details/114495770