call, apple, bind三个函数我找了网上的中文资料,基本没有解释的比较清楚的,英文的看的就豁然开朗了。
直接上例子:
var cat = Cat()
console.log.call(cat, "hello", "world");
这里可以理解成 cat.console.log("hello", "world");,换成通用形式来看func.call(object, arguments) ---> object.func(arguments)。
说白了,就是把函数func的对象改成第一个参数的object,把函数func的参数改成后面的arguments。
apply基本和call一样,唯一的区别就是后面的arguments必须是数组,也就是必须要在"hello", "world"加上中括号。
var cat = Cat()
console.log.call(cat, ["hello", "world"])
bind原理一样的,只是call和apply都只是临时的改变func的对象和参数,或者说是调用一次就完了,但是bind是直接绑定上去,供以后使用。
分两步来看:
第一步:console.log.bind(cat, "hello")
这里其实就是把cat和"hello"先绑定到函数console.log上面去。以后调用console.log的时候,默认对象就是cat, 初始的参数就是"hello"。
第二步:console.log.bind(cat, "hello")("world")
刚刚已经给console.log绑定好了对象和初始的参数,现在就可以调用了。可以理解为console.log(cat, "hello", "world")。
也就是说,bind给console.log绑定了一个默认的对象,还有前面的参数。再次的调用的时候,参数自动再扩充。