我正在研究下划线的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)));
};
答案 0 :(得分:1)
在delay()
调用apply()
会导致用户提供的函数执行。没有明显的或记录在案的合同,this
应该在此功能的上下文中。将null
作为this
引用传递是有意义的,因为它简化了最终用户的调试:错误很容易调查。
另一方面,在defer()
中,apply()
用于调用另一个下划线API方法,它在开发人员的控制下是众所周知的。使用下划线作为this
通常是有意义的,作为整个库的通用规则 - 它是直观的,它很短,并且如果以后需要它提供灵活性。