Веб-браузер "строг" для операций с неопределенными переменными в Javascript
Если переменная foo
не определено, обычно я могу делать такие вещи, как:
!foo;
foo === undefined;
foo !== 'some value';
Однако в кодовой базе, над которой я сейчас работаю, есть что-то, что, похоже, заставляет интерпретатор браузера генерировать исключение для любой операции с неопределенной переменной, кроме этой:
typeof foo !="undefined";
Я работаю в тех же браузерах, в которых я обычно работаю (Chrome и Firefox). Но в этот раз я перейду к этому проекту, а не с нуля. Это проект dJango, использующий Backbone.js, подчеркивание, руль, jQuery, yepnope.
Может ли такое поведение быть связано с инструкцией "use strict"
появляется где-то в глобальном пространстве имен? Я выполнил поиск в проекте для текстовой строки "use strict" и нашел ее в некотором коде, который, похоже, пришел из твиттера:
Файлы: bootstrap.js script.js От: http://twitter.github.com/bootstrap/javascript.html#transitions
Я также нашел это в файле json2. Однако я уверен, что этот файл не вызвал у меня проблем в прошлый раз, когда я работал с ним:
Файл: json2.js От: http://www.JSON.org/json2.js
Насколько я знаю, это даже не вызвано включением "использования строгого" где-то...
Есть идеи?
Спасибо!
2 ответа
Существует важное различие между неопределенным и необъявленным.
function test() {
var foo;
if (foo) { /* not executed */ }
}
Это хорошо, потому что foo
объявлен, но его значение не определено.
function test() {
if (foo) { /* exception! */ }
}
Это выкинет исключение (ReferenceError
) так как foo
не объявлено(Если нет window.foo
.)
Когда переменная необъявлена, вы не можете использовать ее в сравнениях.
undeclaredvar = 1;
это единственное что работает: undeclaredvar
неявно объявлено в глобальном пространстве имен.
Объявления строгого режима внутри функции никогда не "утекут" в строгость глобальной области видимости. Так, "use strict";
в Twitter начальная загрузка / JSON2 не повлияет на строгость вашего скрипта.