转载自:http://www.zhihu.com/question/20289071 //call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。
var func1 = function(arg1, arg2) {}; /*通过 func1.call(this, arg1, arg2); 或者 func1.apply(this, [arg1, arg2]); 来调用。其中 this 是你想指定的上下文,
他可以是任何一个 JavaScript 对象,call 需要把参数按顺序传递进去,而 apply 则是把参数放在数组里。
当你的参数是明确知道数量时,用 call,而不确定的时候,用 apply,然后把参数 push 进数组传递进去。*/ function cat() {
} cat.prototype = {
food: "fish",
say: function () {
alert("I love " + this.food);
}} var blackCat = new cat;
blackCat.say(); var whiteDog = {food:"bone"}
blackCat.say.call(whiteDog)
/*
如果我们有一个对象whiteDog = {food:"bone"},我们不想对它重新定义say方法,
那么我们可以通过call或apply用blackCat的say方法:blackCat.say.call(whiteDog);*/ function exam(a, b, c, d, e) { // 先看看函数的自带属性 arguments 什么是样子的
console.log(arguments); // 使用call/apply将arguments转换为数组, 返回结果为数组,arguments自身不会改变
var arg = [].slice.call(arguments); console.log(arg);
} exam(2, 8, 9, 10, 3); // result:
// { '0': 2, '1': 8, '2': 9, '3': 10, '4': 3 }
// [ 2, 8, 9, 10, 3 ]
//
// 也常常使用该方法将DOM中的nodelist转换为数组
// [].slice.call( document.getElementsByTagName('li') );