在學習和使用 JavaScript 的時候,咱們會常常碰到兩個術語:shim 和 polyfill。它們有許多定義和解釋,意思相近又有差別。瀏覽器
Shim
Shim 指的是在一箇舊的環境中模擬出一個新 API ,並且僅靠舊環境中已有的手段實現,以便全部的瀏覽器具備相同的行爲。主要特徵:學習
- 該 API 存在於現代瀏覽器中;
- 瀏覽器有各自的 API 或 可經過別的 API 實現;
- API 的全部方法都被從新實現;
- 攔截 API 調用,並提供本身的實現;
- 是一個優雅降級。
Polyfill
polyfill 是一段代碼(或者插件),提供了那些開發者們但願瀏覽器原生提供支持的功能。程序庫先檢查瀏覽器是否支持某個API,若是不支持則加載對應的 polyfill。主要特徵:spa
- 是一個瀏覽器 API 的 Shim;
- 與瀏覽器有關;
- 沒有提供新的API,只是在 API 中實現缺乏的功能;
- 以只須要引入 polyfill ,它會靜靜地工做;
shim 的概念要比 polyfill 更大一些,能夠將 polyfill 理解爲專門兼容瀏覽器 API 的 shim 。簡單的說,若是瀏覽器X支持標準規定的功能,那麼 polyfill 能夠讓瀏覽器 Y 的行爲與瀏覽器 X 同樣。插件