25

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た。

この特定のスクリプトはキャンバスを使用しないため、すべてのIE8ユーザーを書き留めるのを少しためらっています。

標準的な回避策はありますか?

私はJavaScriptである程度大丈夫ですが、それでも少し初心者です。ですから、解決策が完全に明白であるならば、私を許してください。

4

4 に答える 4

50

このページには優れた互換性スクリプトがあります: 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;
  };
}
于 2012-06-15T16:17:47.217 に答える
4

最善の解決策は、Modernizrをインストールすることです。

Modernizrは、現在のブラウザーにこの機能がネイティブに実装されているかどうかを通知し、スクリプトローダーを提供するため、古いブラウザーのバックフィル機能にポリフィルを取り込むことができます。

modernizrカスタムバージョンを生成するためのリンクは次のとおりです。http:
//modernizr.com/download/#-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes

于 2012-12-18T14:33:26.523 に答える
2

Function.prototype.bindは、InternetExplorer8以下ではサポートされていません。互換性チャートはこちら: 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;
  };
}
于 2014-04-22T14:35:46.180 に答える
0

関数コンストラクターは、これを行うための昔ながらの方法です。

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) );

参考文献

于 2014-04-04T21:37:13.993 に答える