Веб-браузер "строг" для операций с неопределенными переменными в 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 не повлияет на строгость вашего скрипта.

Другие вопросы по тегам