看到这样一行老代码:
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)
还有这种操作??
扫码留言