underscore.js中 cb 函数与optimizeCb函数
来源:互联网 发布:windows 10声音咋调 编辑:程序博客网 时间:2024/05/16 07:55
在解读underscore.js源码的时候,首当其冲地便遇上了这两个函数,对于哦呜这么个小白来说,这段代码的作用和意义真的如同天书难懂。废话不多说,我们先归纳一下整个underscore.js中都那些函数用到了这两个函数1、optimizeCb(optimize:使最优化和尽可能地完善) cb 、 _.each 、_.times2、cb _.map 、 _.filter 、 _.reject 、 _.every 、 _.some 、 _.any 、_.min 、 _.sortBy 、 group _.sortedIndex 、 createPredicateIndexFinder(_.findIndex、_.findLastIndex) 、 _.mapObject 、 _.findKey经过大致的搜索,整个underscore.js中大致也就上面的函数中使用了cb 和 optimizeCb函数。这些大部分集中在了集合和数组部分,我们分析一下这些函数区别:1、相同点 都需要回掉函数去处理目标。2、不同点 有一部分函数既可以接受回调函数去处理目标,也可以不接受回调函数去处理目标。如果没有接受回调函数,那么它的函数内部要提供一个默认的回调函数。先分析一下 cb 函数的源码var cb = function(value,context,argCount){//参数列表 1:回调(可以是函数也可以是字符串或者对象);2:上下文;3:参数长度 if(_.iteratee !== builtinIteratee) return _.iteratee(value,context); if(value == null) //当函数没有使用回掉函数,但必须要有一个回掉函数那么返回一个匿名函数,此匿名函数接受什么值返回什么值 return _.identity; if(_.isFunction(value))//如果是函数,则用optimizeCb return optimizeCb(value,context,argCount); if(_.isObject(value)&&!_.isArray(value)) //如果是对像不是数组则返回一个匿名函数,这个匿名函数的作用是接受一个对象,看这个对象是否包含value这个对象 return _.matcher(value); return _.property(value); //如果传进来的value既不是函数又不是对象,则使用property函数返回一个匿名函数, // 这个匿名函数的作用是传进去一个对象得到这个对象的某个属性值(该属性对应参数value)};我们代码中需要一个‘回调’,对于用户来说这个‘回调’既可以是函数也可以是其他值。但是在函数的内部这个‘回
调’必须是函数,这时候就需要用cb函数去返回一个符合要求的回调函数。所以经过分析,cb函数是为了让我们得到一
个符合我们要求的回调函数,并且可以绑定在指定的上下文环境。
optimizeCb 函数var optimizeCb = function(func,context,argCount){//参数列表 1:函数;2:上下文;3:参数长度 if(context === void 0)//如果不需要改变执行环境,则将回调返回。 return func; switch(argCount){//根据参数的长度来选择返回新回调的形式 case 1: return function(value){ return func.call(context,value); }; case null : ;//如果没有传入参数长度一律按长度为3来计算 case 3 : return function(value,index,collection){ return func.call(context,value,index,collection); }; case 4 : return function(accumulator,value,index,collection){ return func.call(context, accumulator, value, index, collection); }; } return function(){ return func.apply(context,arguments); };};optimizeCb 函数 字面上的意思是对cb也就是回调函数的优化。主要用来改变函数的执行环境和执行函数。下面是对switch的分析1 :一般是用在接受单值的情况,比如times,sortedIndex之类的函数。2 :据说是给比如jQuery,zepto事件绑定,代理什么的,但是在源代码中没有看到被调用。3 :用于迭代器函数,比如foreach,map等。4 :用reduce和reduceRight函数。对于为什么要用switch来分别处理参数长度不同的回调,而不是直接返回:return function(){ return func.apply(context,arguments);};原因 : 貌似是为了做优化,由于本人对优化还不明白,所以放到日后补充,懂得人可以参考下面网址https://github.com/jianjiade/javascript-frame-lib-analyse/issues/4
阅读全文
0 0
- underscore.js中 cb 函数与optimizeCb函数
- Underscore.js template()函数全解析
- javascript函数式编程库-underscore.js
- 从underscore中提取模板函数
- underscore学习笔记—与函数有关的函数/Function
- underscore 扩展函数
- underscore.js中template
- JS中函数声明与函数表达式
- js中普通函数与函数对象
- Underscore轻量级模板解析函数
- Underscore轻量级模板解析函数
- 【UnderScore.js】JavaScript 工具库,提供了一整套函数式编程的实用功能
- Underscore.js
- underscore.js
- Underscore.js
- underscore.js
- underscore.js
- underscore学习笔记—数组函数/Arrays
- 编程式事务
- UVa1595 Symmetry题解 枚举中线+Hash
- JavaScript中getBoundingClientRect()方法详解
- 测试使用CSDN-markdown编辑器
- 解决invalid byte sequence in GBK
- underscore.js中 cb 函数与optimizeCb函数
- 第一个Linux+QT程序(ARM平台)
- 中国剩余定理与韩信点兵问题原理
- PCB天线
- codeforces——339B——Xenia and Ringroad
- 神奇数
- 一些bug
- spring事务
- POJ 1064 Cable master 二分的应用