1

私はおよそに参照する場合:空白、スクリプトコンソールを開き、次のように入力します。クロームJavaScriptのバインド機能矛盾

var x = function() { 
    console.info(this.toString() + ' -- ' + arguments.length.toString()); 
}; 
x.bind; 

応答がx.bindはネイティブコードで実装されていることを示しています

function bind() { [native code] } 

私は私のWebアプリのページのスクリプトコンソールをプルアップし、同じ文を実行するときx.bindがネイティブimpplementedないようにしかし、それはなります

function (a){var b=this;return function(){b.apply(a,arguments)}} 

この実装をこのように切り替える原因は何ですか?私のJavaScriptでこれを引き起こす可能性のあるものがありますか?私はページ上でjQueryを使用しています - それは影響がありますか?

答えて

4

他のライブラリ/スクリプトではbindFunction.prototypeが追加されていますが、すでに存在するかどうかを確認せずに、ネイティブの実装をうれしく上書きするものもあります。私はあなたがページ上で他のスクリプト(jQueryに加えて)を使用している必要があり、他のスクリプト(それがjQueryプラグインなのかどうか)をチェックせずに上書きしていると仮定します。

私はChromeでテストしましたが、実際のページ内で関数のbindプロパティにネイティブコードマーカーが表示されているかどうかにかかわらず、jQueryがロードされているかどうかにかかわらずです。 (私は、最新のプロトタイプをロードするとは対照的に、それはそれ自身でChromeのネイティブバージョンが上書きされます。)

Example with page with no libraries、出力をChromeで:

Prototype not loaded 
jQuery not loaded 
function bind() { [native code] }

Example with page with latest jQuery、出力をChromeで:

Prototype not loaded 
jQuery found: 1.6.2 
function bind() { [native code] }

Example with page with latest Prototype、Chromeで出力:

Prototype found: 1.7 
jQuery not loaded 
function bind(context) { if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; var __method = this, args = slice.call(arguments, 1); return function() { var a = merge(args, arguments); return __method.apply(context, a); } }

あなたの例では、最新のPrototypeをロードしていませんが、の何かは、Function.prototype.bindを上書きしています。

+0

ありがとうございました!あなたは絶対に正しいです - 私はバインドを置き換える私のページのスクリプトを見つけました。 – FlyingDeveloper

+0

@飛行:心配しないで、喜んで助けました。 :-) –