经常碰到JS中的这三兄弟,记一下他们的用法和区别。
1.改变函数上下文
2.就算不为了改变,但JS那坑爹的作用域下,也为了能够明确知道函数上下文
(为什么要改变请参考JS的作用域链)
区别:
call与apply
call与apply用法很相似,区别就是一个是一个一个传参数,一个是传一个参数数组
fun().call(object, p1, p2);
fun().apply(object, [p1,p2]);
或者经常直接继承父函数参数
fun().apply(object, arguments);
call和apply都会立刻执行,只是改变了fun()里面的this
bind不会立刻执行,bind会返回一个指定上下文的函数
var fun1 = fun().bind(object, p1, p2); //参数传递跟call一样
bind最适合作为回调函数使用,尤其是setTimeout
func(function(){}.bind(this));
我们知道,setTimeout的回调函数上下文会被置为window(use strict下是null),在setTimeout中没办法使用原有实例,bind就可以了
setTimeout(function(){}.bind(this), 1000);