array中的很多方法通过call和apply调用时会返回window对象,如下写法在firefox、chrome等浏览器中会取到window对象:
window === ([]).sort.call();window === ([]).reverse.call();([]).concat.call()[0] === window |
可以将这些array的方法重写,避免它在运行时的this指向window,如重写sort方法:
Array.prototype.sort = (function(sort) { return function(callback) { return (this == window) ? null : (callback ? sort.call(this, function(a, b) { return callback(a, b) }) : sort.call(this)); }})(Array.prototype.sort); |