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是你改变上下文环境之后并非立即执行的,而是回调的时候执行.
- 敲黑板,总结一下
- apply 、 call 、bind 三者都是用来改变函数的this对象的指向的
- apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下
文 - apply 、 call 、bind 三者都可以利用后续参数传参
- bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用
- 今天小师傅出了一道课下练习题,求数组的最大最小值,那就也放出来吧
- es6 的解决办法
Math.max(...[1,2,3]) // 3
使用...
都数组解构 -
Math.max.apply(null, [1,2,3]) // 3
就是这么神奇
Math.max([1,2,3]) // NaN