При смешивании this, нотации массива и шаблона модуля в IE8

Мое «одностраничное приложение» состоит из кода в нескольких файлах с использованием «свободного расширенного модуля» шаблон, описанный Беном Черри. Вот два урезанных примера модулей.

Некоторые "данные" в одном модуле:

var application = (function ( App ){
    App.usesvar = {
        one: 'one',
        two: 'two',
        three: 'three'
    }
    return App;
}( application || {} ));

«Главный» модуль, который представляет приложение в целом и инициализирует приложение:

// the 'master' module
var application = (function ( App ){
    console.log( 'Using `var` (should log "three"): ' + App.usesvar.three );

    return App;
}( application || {} ));

Они работают так, как ожидалось. Сначала данные импортируются на страницу, и главный модуль может получить к ним доступ и распечатать ожидаемые значения.

Часть моего приложения не может быть построена таким образом. Вместо этого некоторый JavaScript генерируется на этапе сборки, и его вывод выглядит следующим образом:

this["application"] = this["application"] || {};
this["application"]["usesthis"] = this["application"]["usesthis"] || {};
this["application"]["usesthis"]["one"] = 'uno';
this["application"]["usesthis"]["two"] = 'dos';
this["application"]["usesthis"]["three"] = 'tres';

Обратите внимание, что он пытается использовать то же пространство имен application, что и предыдущий код, и поэтому usesthis должен быть виден «главному» модулю, как и usesvar из первого фрагмента.

Добавление console.log( 'Using `this` (should log "tres"): ' + App.usesthis.three ); в «главный» модуль регистрирует то, что вы ожидаете в Chrome, Safari Firefox (недавний) и IE10. В IE8 (я еще не тестировал IE9) этого не происходит. В IE8, «главный» модуль, не имеет доступа к свойствам, объявленным с использованием нотации `this['namespace']['property'].

В примерах предположим, что файлы загружаются в правильном порядке. Фактическое приложение также импортирует файлы в правильном порядке. Если пример JavaScript записан в теги <script></script> HTML-файла, а не импортирован, проблема все еще возникает.

Раскрытие информации: нотация this['foo']['bar'] генерируется прекомпилятором Handlebars.js, поэтому у меня нет большого контроля над стиль его вывода. Это проверенный в бою фрагмент кода, поэтому я ожидаю, что он должен работать в IE8 и прекрасно сочетаться с большинством другого кода. Я чувствую, что это не проблема Handlebars, а проблема области вокруг `var foo = (function bar(){}()); шаблон.


person Simon Dell    schedule 05.12.2014    source источник
comment
Может быть, эта проблема stackoverflow.com/questions/2635018/   -  person robC    schedule 05.12.2014
comment
Это выглядит многообещающе. Спасибо!   -  person Simon Dell    schedule 06.12.2014