淘宝UA算法window隐藏技巧与事件驱动机制

       新版淘宝UA算法js文件中处处是技巧,困扰着我前几名的技巧应用要属return this, on, fire以及exports等字眼。exports会在下一篇文章中详细讲解,本文记录我对淘宝UA算法js文件中return this,on, fire的理解,欢迎指点。

       本系列文章的研究对象是淘宝新版的UA算法64.js,原文件的下载链接http://af.alicdn.com/js/cj/64.js (该链接已失效),该文件反混淆之后的文件的下载链接 http://pan.baidu.com/s/1o8ep0r4 

        该算法文件反混淆的思路请参阅淘宝UA反混淆之常量替换(201605_64.js)

        该算法文件的总体架构请参阅2016新版淘宝UA算法文件功能框架的粗浅分析

        模块化编程方案请参阅淘宝UA算法中exports应用技巧与算法执行流程

        UA来源信息加密方案请参阅淘宝UA算法UA来源信息加密方案浅析(201605)

        window隐藏技巧

       准确的说,应该是这样的应用方式: function(n){/*省略方法*/}.call(u, function () { return this; } ()

       64.js文件主函数有15个参数,这15个参数均为函数,而这15个函数中,序号为1/3/5/6/7/9/12/13/14的函数均包含上述形式的应用。所以理解这个技巧对于学习整个文件有极大的帮助。

       总的来说,该技巧的目的是为了使用window对象但又不能太明显,具体分析如下图所示,关于call更详细的内容可以参考  https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call

      事件驱动机制

      在反混淆之后的UA算法文件中搜索on或fire,会发现这两个单词的出现频率极高。它们从何而来,所为何事?

      on和fire是很多javascript框架都会用的事件驱动机制。但是淘宝UA算法文件没有使用任何框架,所以on和fire的功能是用原生的js实现的,仍然保留着事件驱动的思想。on是注册事件,fire则是触发一个事件,某个事件被fire触发后会到注册时间列表中寻找事件列表,逐一执行。这两个函数的实现在主函数参数中序号为4的函数中,实现代码如下图所示。

fire and on realize

      淘宝UA算法文件中执行多个on功能后,查看对象f中的内容如下所示。事件名称与相应函数均存储在对象f的_events对象中,同一个事件可以有多个对应函数;当执行到相应事件的fire函数时,会依次执行该事件名称下的函数。

object in f

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Fork me on GitHub