call、apply 和 bind 的区别
不传递参数的情况
function foo(a,b,c){console.log(typeof this); console.log(a,b,c)
}
console.log(‘============call()============’)
console.log(foo.call())
console.log(‘============call()============’)
call 会让函数执行console.log(‘============apply()============’)
console.log(foo.apply())
console.log(‘============apply()============’)
apply 会让函数执行console.log(‘============bind()============’)
console.log(foo.bind())
console.log(‘============bind()============’)
bind 不会执行这个函数,会复制函数function foo1 (a,b,c) {
console.log(this) console.log(a,b,c)
}
console.log(‘============call(new Date())============’)
console.log(foo.call(new Date()))
console.log(‘============call(new Date())============’)
call 调用并改变函数执行时this指向console.log(‘============apply(new Date())============’)
console.log(foo.apply(new Date()))
console.log(‘============apply(new Date())============’)
apply 调用并改变函数执行时this指向console.log(‘============bind(new Date())============’)
console.log( foo.bind(new Date())())
console.log(‘============bind(new Date())============’)
bind 只是改变this !!!!不会立即执行!!!!function foo2 (a,b,c){
connsole.log(a,b,c)
}
console.log(‘============call(null)============’)
console.log(foo.call(null, 1, 2, 3)) // => foo.call(null, 1, 2, 3)
console.log(‘============call(null)============’)
call 调用并改变函数执行时this指向,并通过后续的参数指定函数调用时的实参console.log(‘============apply(null)============’)
console.log(foo.apply(null, [1, 2, 3]))
console.log(‘============apply(null)============’)
apply 调用并改变函数执行时this指向,并将第二参数(必须是数组!!!)作为实参传入console.log(‘============bind(null)============’)
console.log(foo.bind(null, 1, 2, 3))
console.log(‘============bind(null)============’)
bind 只是改变this !!!!!不会立即执行!!!!! 如果需要指定调用时的实参可以参考call
总结:apply 、call 二者而言,作用完全一样,只是接受参数的方式不同而已,call的传参方式是一个个传的,而apply是以数组的形式从传参的,bind是在ES5中扩展的(IE6,7,8不支持),它是改变上下文的this指向。它跟call很相似。bind的返回值是函数,它的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。