JS技术

暴力分析backbone.js(8)

字号+ 作者:superjs 来源:cnblog 2015-06-06 16:59 我要评论( )

继续上一节,这节来分析Backbone.Events.on方法里的if语句。 先看一下on方法的if语句。 我们先不看它的满足条件,直接先看结果,会执行什么。 return this,在一个函数里,遇到return,那么下面的代码将不会被执行。 我们在把if语句分块一下 || 逻辑运算符,

继续上一节,这节来分析Backbone.Events.on方法里的if语句。

  先看一下on方法的if语句。

  

  我们先不看它的满足条件,直接先看结果,会执行什么。 return this,在一个函数里,遇到return,那么下面的代码将不会被执行。

  我们在把if语句分块一下

  1. || 逻辑运算符,就是说,2条表达式,其中一条为false 时,执行if语句
  2. !eventsApi(this, 'on', name, [callback, context]):eventsApi这个函数并没有在前面出现过,我来检索一下在分析一下。
  3. !callback: callback是回调函数,就是说,callback为false即都会满足if语句。

  把代码定位到line183,来分析一下 eventsApi,先来看一下图片

  

  先来对比一下形参和实参,看看传进来的是什么东西?

  实参:

1
eventsApi(this'on', name, [callback, context])

  形参:

1
var eventsApi = function(obj, action, name, rest) {}

  然后在把eventsApi函数内的 return划分出来,原因是Backbone.Events.on方法下的if语句的判断条件内执行了 eventsApi函数 前面是逻辑非运算符,即eventsApi函数执行后,return false,即Backbone.Events.on方法下的if满足条件。

  eventsApi函数内总共有4个return (注意return false的都是地雷)

  1.判断形参 (非name)  name === false即满足条件

1
if (!name) return true;

  2.检查name形参的类型 === 'object',然后是这个for in,思考一下,一般我们的自定义函数名不会传对象,我试着传递{}对象,空对象没有属性,根本遍历不出东西,所以根本不会执行obj[action].apply(obj, [key, name[key]].concat(rest)); 这个可能适用于其他场景,等以后面遇见了在讲解。

1
2
3
4
5
6
if (typeof name === 'object') {
  for (var key in name) {
    obj[action].apply(obj, [key, name[key]].concat(rest));
  }
  return false;
}

  3. eventSplitter在line177 var eventSplitter = /\s+/;  查找对应的字符串中是否存在,这个也可能是适用于其他的场景,等以后遇见在讲解。

1
2
3
4
5
6
7
if (eventSplitter.test(name)) {
  var names = name.split(eventSplitter);
  for (var i = 0, l = names.length; i < l; i++) {
    obj[action].apply(obj, [names[i]].concat(rest));
  }
  return false;
}

  4.前面3个条件都没满足,就return true。

1
return true;

  

  感觉有点不好,就算传参错了,还是返回this。没有异常,不过既然这样写,一定是有这样写的道理吧,待挖掘!

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • SSH网上商城---需求分析+表关系分析 - 丁国华 廊坊师范学院信息技术提高班 第十期 - 博客频道 - CSDN.N

    SSH网上商城---需求分析+表关系分析 - 丁国华 廊坊师范学院信息技术

    2015-12-14 17:36

  • 查找栈的增长方向的分析及C代码实现 - 周兆熊的专栏 - 博客频道 - CSDN.NET 周兆熊的专栏 2015年度“博

    查找栈的增长方向的分析及C代码实现 - 周兆熊的专栏 - 博客频道 - CS

    2015-12-14 15:15

  • 全球最低功耗蓝牙单芯片(DA14580)系统架构和应用开发框架分析 - 嵌入式企鹅圈 - 博客频道 - CSDN.NET

    全球最低功耗蓝牙单芯片(DA14580)系统架构和应用开发框架分析 - 嵌

    2015-12-13 11:31

  • 关于搜索引擎页面分析中的 javascript 处理的2个思路_javascript教程教程

    关于搜索引擎页面分析中的 javascript 处理的2个思路_javascript教程

    2015-10-04 10:02

网友点评