请帮助我理解以下代码:
将名为'later'的方法添加到所有对象。此方法将来使用setTimeout
来调用其他方法。
Object.prototype.later = function (msec, method) {
// save 'this' as 'that' so we can use 'this' in inner function
var that = this;
// I cannot understand: what [2] means
// args will be ['Make is']. How?
var args = Array.prototype.slice.apply(arguments, [2]);
if (typeof method === 'string') {
method = that[method];
}
// now use setTimeout to call method in future
setTimeout(function () { method.apply(that, args); }, msec);
return that;
}
// example of using later method
var car = {};
car.make = 'Ford';
car.show = function (message) {
alert(message + ' ' + this.make);
}
car.later(1000, 'show', 'Make is');
因此,当我们致电car.later
时,会传递第三个参数并将用于警告功能
问题是:我们如何阅读第三个参数“Make is”?
答案 0 :(得分:3)
apply
函数期望第二个参数是一个数组,其元素将是所应用函数的参数。所以,这个:
var args = Array.prototype.slice.apply(arguments, [2]);
...说要在传递参数Array
的{{1}}对象上调用slice
的{{1}}方法(即填充arguments
个对象使用一个元素(数字2)调用2
。
如果arguments
对象有自己的slice
方法,那么上面的内容将等同于:
arguments
slice
技巧是必要的,因为arguments.slice(2);
实际上不是apply
的实例,并且没有arguments
方法。
这样做会返回一个新数组,其中包含来自第三个对象的Array
个slice
对象的所有元素。这就是它返回later
的原因。
如果你真的只想要arguments
中第三个元素的字符串,那么这样做:
['Make is']
还要注意arguments
的存在,就像arguments[2];
一样,只是它允许你传递一个值列表来用来填充call
对象,这样你就不会你必须像上面所做的那样将你的参数包装在一个数组中:
apply
答案 1 :(得分:1)
Javascript中的“参数”是传递给函数的所有参数的类数组对象。如果您稍后致电:
car.later(1000, 'show', 'Make is');
“arguments”的值将是[1000,'show','Make is'],因此数组的各个元素如下:arguments [0]为1000,arguments [1]为'show' ,参数[2]是'Make is'。这是一个页面,解释了JavaScript函数中的一些可选参数:http://www.openjs.com/articles/optional_function_arguments.php,这里有一个很好的参数可以进入参数对象:https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#Using_the_arguments_object