zoukankan      html  css  js  c++  java
  • 暴力分析backbone.js(8)

    继续上一节,这节来分析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,先来看一下图片

      

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

      实参:

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

      形参:

    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即满足条件

    if (!name) return true;
    

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

    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+/;  查找对应的字符串中是否存在,这个也可能是适用于其他的场景,等以后遇见在讲解。

    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。

    return true;
    

      

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

  • 相关阅读:
    KEIL5.25生成.bin文件步骤
    【转】树莓派网线直连笔记本电脑
    由编译器指定数组长度带来的一个问题
    【转】C/C++位域结构深入解析
    【转】大小端存储模式精解
    【转】树莓派入门之装系统
    【转】树莓派Raspberry Pi
    stm32的双向io口
    小记之while循环条件的操作位置
    【转】浮点数在计算机中存储方式
  • 原文地址:https://www.cnblogs.com/superjs/p/4483712.html
Copyright © 2011-2022 走看看