“古人”是如何加载脚本并防止缓存的

看到这样一行老代码:

with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];

初看一头雾水。拆解如下:

  • new Date() JS 毫秒级时间戳

  • new Date() / 36e5 小时级时间戳

  • ~(-new Date() / 36e5) 取整 && -= 1

==不推荐使用位运算符取整。可读性不高,而且它只在数字小于 2^32-1 的时候可用来取整==

  • ?cdnversion=' + ~(-new Date() / 36e5) 最多缓存一小时

  • with 语句的作用是扩展作用域链(scope chain):

with (expression) {
  statement
}

它将某个对象添加的作用域链的顶部,如果在 statement 中有某个未使用命名空间的变量,跟作用域链中的某个属性同名,则这个变量将指向这个属性值。如果沒有同名的属性,则将拋出 ReferenceError 异常。

==不推荐使用 with 语句,因为可能造成 bug 或者性能损失。在 ECMAScript 5 strict mode 中该语句已被禁止。==

所以它是对如下代码的改写:

0[(document.getElementsByTagName('head')[0] || document.body).appendChild(document.createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)]
  • document.getElementsByTagName('head')[0] 这个写法有点迷,都用了 document.body 却不用 document.head

  • 0[keyName] 将这行代码的返回值变为 undefined

因为如下代码有返回值(返回值为字符串):

(document.getElementsByTagName('head')[0] || document.body).appendChild(document.createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)

还有这种操作??

可以的,很强。

image.png

扫码留言