2013-03-19 2 views
2

В других браузерах, которые я пробовал (например, Chromium, IE, Safari), область действия по умолчанию, выполняемая на консоли (вне любой функции), такая же, как и код, выполняемый вне функции в <script>. То есть, относится к объекту window, и все вновь объявленные переменные становятся глобальными (и, что эквивалентно, свойствами объекта window).Размер по умолчанию в веб-консоли Firefox - что происходит?

В Firefox ... что-то еще происходит, но я не могу понять, что. В большинстве браузеров this === window оценивает true на консоли Chrome, но в Firefox это неверно. this.window === window верно в Firefox. По этой причине переменные, объявленные или назначенные через консоль, не становятся видимыми для скриптов, запущенных на странице, если вы не указали их как атрибуты объекта window явно.

Чувство не останавливается на достигнутом. Задания, сделанные объекту window, магически распространяют и изменяют переменные в области консоли Firefox, но обратное неверно. Пример:

window.foo = 5; 
console.log(foo); // 5 
console.log(this.foo); // 5 
console.log(window.foo); // 5 
foo = 10; 
console.log(foo); // 10 
console.log(this.foo); // 10 
console.log(window.foo); // 5 -- in any other browser, this would be 10 

Что происходит за кулисами? Каков загадочный объект, который this относится к Firefox, и почему он имеет эту своеобразную связь с объектом window? Является ли этот материал документированным где угодно?

(В случае, если это имеет значение, я испытал этот материал в Firefox 19.0.2. Я не проверял другие версии Firefox.)

+0

Похоже, что он работает в другом пространстве. То, что вы видите, - это то, как работает прототипное наследование. (Похоже, вы видите объект, прототипом которого является foo). (Связанный вопрос Я только что нашел http://stackoverflow.com/questions/1803660/firebug-console-window-scope-why-isnt-this-always-the-same) –

+0

Попробуйте просто запустить 'debugger;' в консоли. –

+0

Я нахожусь на своем телефоне, поэтому не могу получить ссылку, но google «kangax delete», и вы должны получить объяснение этого странного поведения. –

ответ

3

Что вы испытываете, потому что веб-консоль Firefox оценивает заявления в песочнице ,

Here is an open bug about it в Bugzilla

Выражения, введенные в веб-консоли и блокнота оцениваются в песочнице глобальной прототипом которого является окно содержания: this.__proto__ === window.

У этого есть некоторые приятные эффекты: переменные, объявленные в Scratchpad, являются локальными для этой блокнотной памяти, а не загрязняют глобальный контент; вы можете поиграть. Если вы хотите создать глобальную переменную, видимую для содержимого, всегда можно просто создать свойство в окне: «window.newGlobal =« fruit ».

Однако, я подозреваю, что это на самом деле не полезно. Простейшей ментальной моделью для разработчиков является код, введенный в Web Console/Scratchpad, который оценивается так же, как и содержимое их элементов. Объясняя, почему «x» показывает содержимое x, но «x = 5» не меняет его (но «xy = 5» - это, видимый для контента!) Включает в себя определенную деталь, которую интересуют только более заинтересованные разработчики.

Это, безусловно, полезно для предоставления функций полезности, которых нет в содержании; но это может быть сделано путем оценки выражений в области выражения 'с', применяемого к объекту с функциями полезности в качестве его свойств. «С» не моя любимая конструкция, но поскольку мы полностью контролируем свойства объекта, недостатки использования «с» вообще не применяются; как только вы решили ввести некоторые функции только для веб-консоли, поведение «с» в значительной степени зависит от того, что вам нужно.(Не забывайте, что следующее создают привязки для й и у на глобальном:.

with (o) { var x = 5; y = 6; } 

Так «с» повторно не вводить проблемы песочниц я упомянул выше)

О как это работает. В JavaScript наследование является прототипом. Что такое песочница - это объект, у которого прототип - это окно, а не само окно. Here is a tutorial about it в MDN.

+0

Sweet - вы не только проследили некоторое обсуждение этой проблемы в Интернете, где я потерпел неудачу, но это полезное, интересное обсуждение, объясняющее поведение. Спасибо. –

+0

Добро пожаловать. Я хотел бы упомянуть, что эта проблема не существует в firebug. Не стесняйтесь просматривать некоторые мои другие ответы на SO о прототипных цепочках –

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