Несоответствие функции привязки JavaScript в Chrome - PullRequest
1 голос
/ 05 июля 2011

Если я перехожу к about: blank, откройте консоль сценария и введите следующее:

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

Ответ показывает, что x.bind реализован в собственном коде:

function bind() { [native code] }

Однако, когда я открываю консоль сценария на странице моего веб-приложения и выполняю те же операторы, создается впечатление, что x.bind изначально не реализован:

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

Что может заставить эту реализацию переключаться следующим образом? Есть ли что-то, что я устанавливаю в своем javascript, что может вызвать это? Я использую JQuery на странице - это будет иметь влияние?

1 Ответ

4 голосов
/ 05 июля 2011

Не jQuery, но некоторые другие библиотеки / скрипты добавляют bind к Function.prototype, и некоторые из них делают это, не проверяя, есть ли они там, с радостью перезаписывая собственную реализацию.Я предполагаю, что вы должны использовать какой-то другой скрипт (кроме jQuery) на странице, и этот другой скрипт (будь то плагин jQuery или что-то еще) перезаписывает без проверки.

Я только что протестировал в Chromeи независимо от того, загружен ли у меня jQuery или нет, изнутри фактической страницы при просмотре свойства bind функции отображается маркер собственного кода.(Напротив, если я загружаю последний Prototype, он перезаписывает собственную версию Chrome своей собственной.)

Пример со страницей без библиотек , вывод в Chrome:

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

Пример со страницей с последней версией jQuery , вывод в Chrome:

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

Пример со страницей с последним прототипом , вывод в Chrome:

Prototype found: 1.7
jQuery not loaded
<code>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); } }</code>

Из вашего примера вы не загружаете последний Prototype, но что-то перезаписывает Function.prototype.bind.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...