e = console.info;не работает в хроме - PullRequest
2 голосов
/ 10 января 2012

Так что я ленивый и хотел бы дать console.info новое имя функции :) Но я также хотел бы быть в безопасности и быть уверенным, что я могу оставить свой вход в систему, а не ошибку в браузерах, которые не поддерживают консоль.Итак, я написал это:

if (typeof console == "object" && typeof console.error == "function") {
    e = console.info; 
}

Теперь проблема возникает только в Chrome и получить следующую ошибку:

Uncaught TypeError: Illegal invocation

Мне кажется, что это очень общая ошибка.

1 Ответ

7 голосов
/ 10 января 2012

Наиболее вероятное объяснение состоит в том, что функция info объекта console ожидает, что this в функции будет объектом console. Это не будет так, если вы сделаете это:

var e = console.info;
e("Foo");

Помните, что в JavaScript this полностью определяется , как функция вызывается , а не там, где она определена. Подробнее: Мифические методы и Вы должны запомнить this.

Вы должны сделать это вместо этого:

e.call(console, "Foo");

... что явно не короче.

Таким образом, чтобы сделать это надежно, вместо этого вы должны создать функцию:

function e(msg) {
    console.info(msg);
}

jИнди указал, что мы также можем использовать для этого Function#bind (часть ES5), поскольку в Chrome это есть, а в Chrome console.info - настоящая функция JavaScript. Итак:

e = console.info.bind(console);

Это будет работать только в браузерах, которые поддерживают ES5 (например, не в IE8 и более ранних версиях), и где console.info - это real функция JavaScript (некоторые функции, предоставляемые хостом в некоторых браузерах, хотя я думаю console.info на большинстве, если не на всех). Но если вы ориентируетесь на Chrome, вы золотой. Кроме того, bind - это одна из функций ES5, которую тривиально реализовать в браузере не-ES5 (проект es5-shim.js и некоторые другие). Но реализация bind исключительно для этого использования, вероятно, излишняя, просто используйте function e(msg) { .. } выше. : -)

Живой пример всего вышеперечисленного

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