2016-05-25 2 views
5

Учитывая, что console не перекрываться и относится к нативному объекту, console.log метода (и, возможно, другие) извлекаются из console объекта сconsole.log экстракции метода из консоли

var log = obj.log = console.log; 
// instead of console.log.bind(console) 
log(...); 
obj.log(...); 

ли 100% безопасно с точки зрения совместимости браузера и узла?

Значительное количество примеров JS (возможно, слишком иллюстративное) со связанными console.log предполагает, что это может быть не так.

+0

Вы попробовали, не так ли? В какой среде вы работаете? – epascarello

+0

Это зависит от реализации, но разумная реализация будет реализовывать 'log' как нечто вроде' this._write (log_level, msg, ...) ', т. Е. Сокращенный псевдоним другого внутреннего метода. Таким образом, «это», скорее всего, должно быть сохранено. – deceze

+0

@epascarello Никогда не было проблем с ним в реальных версиях FF и Chrome, но не было уверенно в остальном. – estus

ответ

8

Браузеры отличаются по console реализаций, оказывается, что WebKit/Blink на основе браузеров (Chrome, Opera 15+, Safari и т.д.) являются единственными, которые неудобны с извлеченными console методами. Для совместимости браузера Извлеченные методы должны быть связаны:

var log = console.log.bind(console); 

узел имеет свою собственную console реализацию, которая опирается на this но pre-binds its methods. Безопасно извлекать методы console в приложениях Node, то же самое относится к основному процессу Electron.

NW.js replaces Node console с Chromium годы:

Node.js и Chromium каждый из них имеет свою собственную реализацию SetTimeout и консоли. В настоящее время для консоли мы используем реализацию Chromium повсюду, потому что она может печатать в devtools и получать больше информации.

Невозможно извлечь console методов в контексте NW.js Узла.

1

Действительно ли это на 100% безопасно с точки зрения браузера и совместимости узлов?

Это не так.

  • В методах консоли Node.js привязаны к экземпляру при создании метода. Relevant code in Node.js source.
  • Gecko Консольный метод требует действительных this (несвязанные методы - это i).

Не удалось найти console реализация в источнике Chrome.

+1

Благодарим за предоставление ссылки для Gecko, но я думаю, что правильным является https://github.com/mozilla/gecko-dev/blob/e169c5fcb3ceaa196a273400a5d913b3f0c75de5/toolkit/modules/Console.jsm#L639-L644 – estus

Смежные вопросы