apply call bind

apply call bind 的区别

  • apply,call的存在是为了改变函数体内部this的指向,改变作用域的.来举个栗子:
function People(){}
People.prototype = {
   age=18,
sayAge = function(){
    return this.age
}
let me = new People()
me.sayAge() //18
let you = {age: 22}
me.sayAge.apply(you) // 22
me.sayAge.call(you) // 22

可以看出来apply,call的作用是一样的,都在动态的改变this的指向,但是它们接受参数的方式不太一样
apply(this, [arg1, arg2,arg3])
apply以数组的形式接受参数
call(this,arg1,arg2,arg3)
call参数按顺序传递进去

  • bind MDN给出的解释是: bind()方法创建一个新的函数,当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列.
    fun.bind(thisArg[, arg1[, arg2[, ...]]])
    thisArg 当绑定函数被调用时,该参数会作为原函数运行时的this指向.当使用new操作符调用绑定函数时,改参数无效.
    arg1,arg2...当绑定函数被调用时,将这些参数置于实参之前传递给被绑定的方法
  • apply, call 是立即执行函数,bind是你改变上下文环境之后并非立即执行的,而是回调的时候执行.
  • 敲黑板,总结一下
  1. apply 、 call 、bind 三者都是用来改变函数的this对象的指向的
  2. apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下
  3. apply 、 call 、bind 三者都可以利用后续参数传参
  4. bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用
  • 今天小师傅出了一道课下练习题,求数组的最大最小值,那就也放出来吧
  1. es6 的解决办法 Math.max(...[1,2,3]) // 3 使用...都数组解构
  2. Math.max.apply(null, [1,2,3]) // 3 就是这么神奇
    Math.max([1,2,3]) // NaN

你可能感兴趣的:(apply call bind)