Очень странная вещь в IE8. Определенная переменная распознается как «неопределенная» - PullRequest
1 голос
/ 18 октября 2011

Произошла очень странная проблема, когда я пытался включить lib (Beard.js) для поддержки движка шаблонов JavaScript Haml.

Не удалось правильно загрузить Haml.Я отследил код и выяснил, что Haml никогда не загружался на страницу.После долгих попыток и неудач мне удалось заставить его работать.Странная вещь, которую я нашел:

в исходном Haml lib, это:

var Haml;

(function(){
    ...

    Haml = function(){ ... }

    ...
}());

Я изменил код на:

var Haml;

(function(){
    ...

    window.Haml = function(){ ... }

    ...
}());

тогда он работает ..

ПОЧЕМУ ???Разве Haml не должен автоматически распознаваться как определенное в глобальной области видимости?

Environment - IE8Haml.js - https://github.com/creationix/haml-js
Bear.js - https://github.com/jspopisno1/Beard

-------------- ОБНОВЛЕНИЕ ---------------

в Haml.js, это:

var Haml;

(function(){
    ...

    Haml = function Haml(){ ... }

    ...
}());

Я предполагаю, что в javascript утверждение "function Haml () {}" делает Haml локальным var.Однако, почему Haml может быть правильно загружен в Firefox & Chrome ????

Ответы [ 3 ]

5 голосов
/ 18 октября 2011

Проблема связана с тем, что в JScript (в версиях вплоть до IE8) возникла ошибка, из-за которой выражения именованных функций просачиваются в окружающую область. Так называемые выражения функций анализируются как объявления функций (так же как и выражения функций), тем самым автоматически перемещая локальную переменную Haml в локальную область видимости. После этого вы устанавливаете Haml = function(){}, но это не приводит к глобальной Haml, потому что JScript находит переменную local с этим идентификатором, потому что она неправильно просочилась в локальную область. Таким образом, хотя локальный Haml установлен правильно, глобальный никогда не достигается.

Вы можете прочитать об этом подробнее здесь .

3 голосов
/ 18 октября 2011
> var Haml;
> (function(){
>     ...
>     Haml = function Haml(){ ... }
>     ... 
> }());

Этот код не выдает никаких ошибок в IE 8 для меня.Часть, которую вам не хватает в вашем вопросе, является следующим утверждением:

alert(typeof Haml);

, которое показывает undefined в IE и функция в Firefox и других.

Назначение Haml является выражением с именем функции (имя необязательно), и да, IE создаст переменную в текущей области с именем, другие браузеры не.

0 голосов
/ 18 октября 2011

Разве Haml не должен автоматически распознаваться как определенное в глобальной области видимости?

Только если этот код находится в глобальной области видимости. Если она является частью функции, var распространит ее только на эту функцию.

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