补充: apply call bind区别
1.call和apply的区别是,都会改变this指向并且立即执行。call和apply的第一个参数为this所指向的对象,call可以有第二个第三个第四个等等参数,apply第二个参数为一个数组。
2.bind也是改变this指向,但是不立即执行,会返回一个闭包函数。

apply底层模拟实现:

Function.prototype.apply = function (context, arr) {
var context = Object(context) || window;
context.fn = this;

var result;
if (!arr) {
result = context.fn();
}
else {
var args = [];
for (var i = 0, len = arr.length; i < len; i++) {
args.push('arr[' + i + ']');
}
result = eval('context.fn(' + args + ')')
}

delete context.fn
return result;
}