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。没有异常,不过既然这样写,一定是有这样写的道理吧,待挖掘!

  • 相关阅读:
    微信小程序开发工具初始化代码仓库
    微信小程序开发如何初始化远程仓库并 PUSH
    Git 提示用户密码错误如何修改
    MariaDB 在创建外键的时候提示 1005 错误
    Fiddler实现移动端手机抓包
    Windows 安装 Go语言开发环境以及使用
    laravel队列,事件简单使用方法
    视图
    laravel Passport
    多台服务器 同时部署一套代码
  • 原文地址:https://www.cnblogs.com/superjs/p/4483712.html
Copyright © 2011-2022 走看看