我很好奇_.chain
ing函数是如何实现的,以及它是如何(或者更好地,为什么)以它的方式工作的。
特别是我的问题是每个函数的包装发生在哪里。假设我正在使用_.chain(someArray).filter(...);
当我进入该函数时,我可以看到过滤器函数已转换为类似
function () {
var args = [this._wrapped]; //the data from chain(...)
push.apply(args, arguments); //push to the (?) array
return result.call(this, func.apply(_, args)); //?? where are these coming from?
}
我可以看到该函数在其范围内有 3 个闭包(将其与未链接的函数进行比较,该函数显示函数的定义,而没有对其原始函数的所有闭包)
第一个是find 函数本身,第二个是“对对象本身的安全引用”,第三个是下划线类本身。
调用时_.chain()
,如何以及在哪里(代码方面)进行转换(创建范围等)。我理解了
//http://underscorejs.org/docs/underscore.html#section-139
_.chain = function(obj) {
return _(obj).chain();
};
被调用,这去
//http://underscorejs.org/docs/underscore.html#section-145
//...
chain: function() {
this._chain = true;
return this;
},
//...
然后我被卡住了。我无法弄清楚从那里会发生什么。我假设魔法发生在构造函数内部,但我似乎无法弄清楚闭包的额外创建从何而来。所有函数本身都没有显示任何被包装的迹象,链调用看起来没有就像它包裹了一些东西。result
似乎在那里,但我不知道它来自哪里。那么,这是在哪里以及如何发生的呢?