call,apply,bind这三个方法其实都是继承自Function.prototype中的,属于实例方法。
1、apply
改变调用apply方法的函数this的指向,并执行该函数,使用apply时注意参数以数组的形式传递
示例:
function fn1(a ){ console.log(this, a)}
let obj = {'b': 11}
fn1.apply(obj1, [22]) // {'b': 11} , 22
2、call
改变调用apply方法的函数this的指向,并执行该函数,使用call时注意参数以单个的形式传递
示例:
function fn1(a ){ console.log(this, a)}
let obj = {'b': 11}
fn1.call(obj1, 22) // {'b': 11} , 22
3、bind
改变调用apply方法的函数this的指向,不执行新生成的函数,新生成的函数使用call或者apply无效,不会改变新生成函数中的this,传参数和call方法一样
示例:
function f1(){return this.a}
var obj1 = {a:11111};
var obj2 = {a:22222};
var f2 = f1.bind(obj1)
f2() // 11111
console.log(f2.call(obj2)) // 11111
console.log(f1.call(obj2)) // 22222
4、使用apply和call的小知识
Array.prototype.slice.apply($('div')) // 可以将类似数组的对象转换成数组
Array.prototype.slice.call($('div')) // 可以将类似数组的对象转换成数组