我开发了一个需要该bind
方法的 Javascript 库。不幸的是,bind
IE8 不支持。
MDN 网站上有一个 polyfill ,效果很好。
我的问题是:这个 polyfill 和其他 Javascript 库之间是否存在问题或可能不兼容?
在任何情况下都可以安全使用吗?
我开发了一个需要该bind
方法的 Javascript 库。不幸的是,bind
IE8 不支持。
MDN 网站上有一个 polyfill ,效果很好。
我的问题是:这个 polyfill 和其他 Javascript 库之间是否存在问题或可能不兼容?
在任何情况下都可以安全使用吗?
对我来说,与本地人最明显的区别bind
是:
arguments.caller
不指向绑定函数的调用者,但无论如何你都不应该使用它length
绑定函数的设置为 0,这可能会影响函数的数量检查,例如https://github.com/fitzgen/wu.js/blob/master/lib/wu.js#L406恕我直言,如果你只使用 JavaScript 的“好的部分”,而不是开发某些框架的核心(对于 IE8?),你不应该面对这个 polyfill 的任何问题。
答案几乎就在 MDN 页面本身:
“如果你选择使用这个部分实现,你不能依赖那些行为偏离 ECMA-262 第 5 版的情况!但是,如果要小心(并且可能需要额外修改以适应特定需求),这个部分实现可能是根据规范广泛实施 bind() 时的合理桥梁。”
这样的 MDN 垫片没有任何问题。但是,如果您选择使用他们的 shim,请确保它不会被其他库覆盖。不久前我遇到了一个问题,Strophe 就是这样做并用另一个垫片替换一个垫片。
我倾向于使用下划线来覆盖此类内容,但还有其他选项,例如 es5shim。使用下划线,您有一个名为(您猜对了)“. bind”的方法,其工作方式与 MDN 的 shim 略有不同(使用“新”调用)。Underscore也有一个很棒的方法,叫做 ' .partial',它在你不想改变 'this' 的值但部分应用参数的情况下很有用。
我在这里要说明的一点是,与其进行匀场,不如查看在库中得到适当保护/封装的东西。如果您的目标是像 IE8 这样的浏览器,那么在任何情况下您都可能需要不止一个 shim。
最后,不是那么重要,请查看以下位置的性能测试:http: //jsperf.com/browser-vs-es5-shim-vs-mdn-shim