我写一些JavaScript使用的Object.bind
方法。
funcabc = function(x, y, z){
this.myx = x;
this.playUB = function(w) {
if ( this.myx === null ) {
// do blah blah
return;
}
// do other stuff
};
this.play = this.playUB.bind(this);
};
由于我在WinXP开发与Firefox,有时测试在Win7与IE 9或10,我没注意还是要注意一个事实,即IE8及以下不支持bind
。
这种特殊的脚本不使用画布,所以我有点犹豫注销所有IE 8的用户。
有没有一个标准的变通?
我让周围的排序在JavaScript中还行,但我还是有点小白。 所以,原谅我,如果该解决方案是完全显而易见的。
有此页面上的良好兼容性脚本: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
只需复制并粘贴到你的脚本。
编辑:把下面的脚本清晰度。
if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeof this !== 'function') {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function() {},
fBound = function() {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
最好的解决办法是安装Modernizr的 。
Modernizr的告诉你当前的浏览器是否有这个功能本身实现与否,它提供了一个脚本加载器,所以你可以在polyfills拉旧的浏览器回填功能。
这里是生成您的自定义Modernizr的版本的链接:
http://modernizr.com/download/#-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes
Function.prototype.bind未在Internet Explorer 8和下方支撑。 这里兼容性图表: http://kangax.github.io/es5-compat-table/
Mozilla开发者网络提供这种替代对于不执行.bind()本身旧的浏览器:
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}