function.arguments问题

时间:2011-03-16 02:49:43

标签: javascript

请帮助我理解以下代码:

将名为'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”?

2 个答案:

答案 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方法。

这样做会返回一个新数组,其中包含来自第三个对象的Arrayslice对象的所有元素。这就是它返回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