在JavaScript的世界里,有两个词经常被提到,Shim 和 Polyfill。它们指的都是什么,又有什么区别?
一个 Shim 是一个库,它将一个新的API引入到一个旧的环境中,而且仅靠旧环境中已有的手段实现。
一个 Polyfill 就是一个用在浏览器 API 上的 Shim。我们通常的做法是先检查当前浏览器是否支持某个 API,如果不支持的话就加载对应的 Polyfill。然后新旧浏览器就都可以使用这个 API 了。
术语 Polyfill 来自于一个家装产品 Polyfilla;Polyfilla 是一个英国产品,在美国称之为 Spackling Paste (译者注:刮墙的,在中国称为腻子)。
记住这一点就行:把旧的浏览器想象成为一面有了裂缝的墙.这些 [Polyfills] 会帮助我们把这面墙的裂缝抹平,还我们一个更好的光滑的墙壁(浏览器) Paul Irish 发布过一个 Polyfills 的总结页面“HTML5 Cross Browser Polyfills”。
es5-shim 是一个Shim (而不是 Polyfill)的例子,它在 ECMAScript 3 的引擎上实现了 ECMAScript 5 的新特性,而且在 Node.js 上和在浏览器上有完全相同的表现(译者注:因为它能在 Node.js 上使用,不光浏览器上,所以它不是 Polyfill)。
举个栗子,有些旧浏览器不支持 Number.isNaN 方法,Polyfill 就可以是这样的:
if(!Number.isNaN) {
Number.isNaN = function(num) {
return(num !== num);
}
}
就是假如浏览器没有 Number.isNaN 方法,那咱们就给它添加上去,所谓 Polyfill 就是这样解决 API 的兼容问题的。