1

about:blank を参照した場合は、スクリプト コンソールを開き、次のように入力します。

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

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

function bind() { [native code] }

ただし、Web アプリのページでスクリプト コンソールを表示して同じステートメントを実行すると、x.bind がネイティブに実装されていないように見えます。

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

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

4

1 に答える 1

4

jQuery ではなく、他のいくつかのライブラリ/スクリプトが に追加bindされFunction.prototype、そのうちのいくつかは、既に存在するかどうかを確認せずに実行し、ネイティブ実装を喜んで上書きします。ページで他のスクリプト (jQuery 以外) を使用している必要があり、その他のスクリプト (jQuery プラグインなど) がチェックせずに上書きされていると思います。

Chrome でテストしたところ、jQuery が読み込まれているかどうかに関係なく、実際のページ内から関数のbindプロパティを確認すると、ネイティブ コード マーカーが表示されます。(対照的に、最新のプロトタイプを読み込むと、Chrome のネイティブ バージョンが独自のもので上書きされます。)

ライブラリのないページの例、 Chrome での出力:

プロトタイプがロードされていません
jQueryがロードされていません
function bind() { [native code] }

最新の jQuery を含むページの例、 Chrome での出力:

プロトタイプがロードされていません
jQuery が見つかりました: 1.6.2
function bind() { [native code] }

最新の Prototype を含むページの例、 Chrome での出力:

プロトタイプが見つかりました: 1.7
jQueryがロードされていません
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); } }

あなたの例から、最新のプロトタイプをロードしていませんが、何かが上書きしていますFunction.prototype.bind

于 2011-07-05T17:34:07.897 に答える