apply、call、bind的作用
在javascript中,三者作用是改变某个函数的执行上下文(Execution Context),具体作用是改变函数体内部this的指向。
举个栗子:
function example() {}
example.prototype = {
name: 'will',
say: function() {
console.log('hi,' + this.name + '!')
}
}
var e = new example()
e.say() // hi,will!
var obj = {
name: 'lucky'
}
e.say.apply(obj) // hi,lucky! 此时this.name是lucky
e.say.call(obj) // hi,lucky! 此时this.name是lucky
e.say.bind(obj)() // hi,lucky! 此时this.name是lucky
apply、call、bind的区别
apply、call只是接受参数的方式不太一样,而且会立即执行,bind会产生一个新函数,需要再次调用才会执行
举个栗子:
function func(arg1, arg2) {
console.log(arg1 + arg2)
}
func.apply(this, [1, 2]) // apply接受的参数,第一个是对象,第二个是数组
func.call(this, 1, 2) // call接受的参数,第一个是对象,后面一个接一个
简单举几个apply、call、bind的应用场景
伪数组转标准数组
var obj = {
0: 1,
1: 2,
length: 2
}
var arr1 = Array.prototype.slice.call(obj) // [1, 2]
var arr2 = Array.prototype.slice.apply(obj) // [1, 2]
取数组中的最大值或者最小值
var arr = [1, 2, 3, 4]
//取最大值
console.log(Math.max.apply(Math, arr)) // 4
console.log(Math.max.call(Math, ...arr)) // 4
//取最小值
console.log(Math.min.apply(Math, arr)) // 1
console.log(Math.min.call(Math, ...arr)) // 1
检验是否是数组
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]'
}
isArray([1]) // true
isArray({}) // false
React中使用bind使函数可以获取到props
class MyCircle extends Component {
constructor(props) {
super(props)
this.func = this.func.bind(this)
}
func() {
...
}
...
}
等等...
总结
三者作用都是改变函数this的指向
三者第一个传参都是要this要指向的对象
apply、call是立即执行函数,bind需要再次调用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。