关于Underscore.js的源码问题

var _ = function(obj) {
    if (obj instanceof _) return obj;
    if (!(this instanceof _)) return new _(obj);
    this._wrapped = obj;
  };
 
 

我想问下为什么 var _ 这个变量要指向这个函数,有什么意义吗?
我看了看源码好像也没有用到_()这样的函数调用,很困惑。。。

 
  _.first = _.head = _.take = function(array, n, guard) {
    if (array == null) return void 0;
    if (n == null || guard) return array[0];
    return _.initial(array, array.length - n);
  };

  _.initial = function(array, n, guard) {
    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
  };
  

从上面看的话,_是个对象,frist和initial是_的方法才对,那为什么直向一个函数,我知道函数也是对象的一种,那为什么不直接new Object()呢?
我第一次看源码,看了高程和JUQERY,总感觉API记住就好,原理还是要懂才行。
是不是我对某个知识点了解的不够深?

阅读 2.6k
3 个回答

不要连API都没有完整的扫一遍的就去看源码,这样只会越看越懵逼。
http://www.css88.com/doc/unde...
这是API中链式调用使用的 _() 方法。

下图是高程的截图,讲述了为什么要用这种语法。
clipboard.png

可以看下这篇的解读

简而言之,这么写就是为了能使用链式语法,比如:

_.throttle(updatePosition, 100);

也可以写成:

_(updatePosition).throttle(100);

还有:

_.map([1, 2, 3], function(n){ return n * 2; });

也可以写成:

_([1, 2, 3]).map(function(n){ return n * 2; });

为了偷懒,后一个例子是直接从文档里抄的,所以你也可以去参考文档

Create a safe reference to the Underscore object for use below.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题