call、bind、apply的区别
call()、bind()、apply()都是用来修改函数this指向的
先看下面例子:
js
var person={
name:'leo',
age: 23,
sex: '男'
}
function fn(a,b){
console.log('姓名:'+this.name+'年龄:'+this.age+'从'+a+'到'+b);
}
// call
fn.call(person,'南昌','武汉')
// 姓名:leo年龄:23从南昌到武汉
// bind
fn.bind(person,'北京','上海')()
//姓名:leo年龄:23从北京到上海
// apply
fn.apply(person,['杭州', '深圳'])
//姓名:leo年龄:23从杭州到深圳
fn.apply(person,'杭州','深圳')
//Uncaught TypeError: CreateListFromArrayLike called on non-object
从上面我们可以看出:
call: 函数执行时的this指向call的第一个参数,其它参数作为传参,call()会立即执行函数
bind: 返回一个新的函数,可以改this指向但不会立即执行
apply: 所有参数都必须放在一个数组里面传进去,它只接受第二个参数为数组
WARNING
bind生成新函数之后不能再次bind修改指向,bind如果传入的不是一个对象则会调用相对的构造函数进行隐式类型转换
TIP
总结:call和bind用法相同,区别就是前者会立即执行函数,而后者会生成个新函数,需要自己手动调用; apply和前两者的传参方式不同,前两者传递的是参数列表,而它只能传递一个参数数组