在下划线源中使用apply

时间:2014-09-11 03:37:52

标签: javascript underscore.js

我正在研究下划线的annotated source,我在_.defer函数中对apply的用法有一个简单的问题。特别是在_.defer中,我们在_对象上使用apply,而在_.delay中,我们使用apply on null。为什么我们不能在_.defer中使用null而不是_,因为我们实际上并没有使用'这个'在哪个功能?

var slice = Array.prototype.slice;

//Delays a function for the given number of milliseconds, and then calls it with the arguments supplied.
_.delay = function(func, wait) {
    var args = slice.call(arguments, 2);
    return setTimeout(function(){
      return func.apply(null, args);
    }, wait);
};

//Defers a function, scheduling it to run after the current call stack has cleared.
_.defer = function(func) {
    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};

1 个答案:

答案 0 :(得分:1)

delay()调用apply()会导致用户提供的函数执行。没有明显的或记录在案的合同,this应该在此功能的上下文中。将null作为this引用传递是有意义的,因为它简化了最终用户的调试:错误很容易调查。

另一方面,在defer()中,apply()用于调用另一个下划线API方法,它在开发人员的控制下是众所周知的。使用下划线作为this通常是有意义的,作为整个库的通用规则 - 它是直观的,它很短,并且如果以后需要它提供灵活性。