Object.bind
メソッドを使用するJavaScriptを少し書いています。
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);
};
私はFirefoxを使用してWinXPで開発し、IE 9または10を使用してWin7でテストすることもあるので、IE8以下がbind
をサポートしていないことには気づかなかった。
この特定のスクリプトはキャンバスを使用しないため、すべてのIE 8ユーザーをオフにすることを少しためらっています。
標準的な回避策はありますか?
私はJavaScriptで大丈夫ですが、まだ少し初心者です。ですから、解決策が完全に明白であるなら、私を許してください。
このページには優れた互換性スクリプトがあります: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
コピーしてスクリプトに貼り付けるだけです。
EDIT:明確にするために、以下のスクリプトを配置します。
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は、現在のブラウザーにこの機能がネイティブに実装されているかどうかを通知し、スクリプトローダーを提供して、古いブラウザーのポリフィルを取り込んでバックフィル機能を提供できるようにします。
これは、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 Developer Networkは、.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;
};
}
Functionコンストラクターは、これを行う昔ながらの方法です。
var foo = function(x,y,z){ return Function("x,y,z","return Math.max.call(this, x, y, z)")(x,y,z) }
var bar = function(x,y,z){ return Function("x,y,z","return Math.min.call(this, x, y, z)")(x,y,z) }
console.log(foo(1,2,3) );
console.log(bar(3,2,1) );
参照