1 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
看著好像是實(shí)例化問(wèn)題,但是如果代碼這樣寫的話:
var iterations = 1000000;
console.time('#init');
var obj = _([1,2,3]);
console.timeEnd('#init');
console.time('#optimizeCb0');
for(var i = 0; i < iterations; i++ ){
obj.each(function(val,key){});
};
console.timeEnd('#optimizeCb0')
console.time('#optimizeCb');
for(var i = 0; i < iterations; i++ ){
_.each([1,2,3],function(val,key){});
};
console.timeEnd('#optimizeCb');
assign:20 #init: 0.000msassign:25 #optimizeCb0: 492.000msassign:30 #optimizeCb: 223.000ms
看輸出的時(shí)間,實(shí)例化貌似問(wèn)題不大,重點(diǎn)在于調(diào)用_.each
跟_().each
的區(qū)別
我沒(méi)用過(guò)后者,跟蹤了一下源碼看其實(shí)現(xiàn):
// Helper function to continue chaining intermediate results.
var result = function(instance, obj) {
return instance._chain ? _(obj).chain() : obj;
};
// Add your own custom functions to the Underscore object.
_.mixin = function(obj) {
_.each(_.functions(obj), function(name) {
var func = _[name] = obj[name];//這里遍歷的時(shí)候 name 有為each的時(shí)候
_.prototype[name] = function() {//當(dāng)name='each'時(shí),_的原型就有了each方法,此時(shí)func=_.each
var args = [this._wrapped];
push.apply(args, arguments);
return result(this, func.apply(_, args));
};
});
};
從這里也可以看出_().each
實(shí)際上底層也是用了_.each
,但是人家不是直接用,還多了一些賦值啊,數(shù)組push等操作,我想后者多花的時(shí)間應(yīng)該出自這些操作吧。
添加回答
舉報(bào)