LINUX.ORG.RU

Глобальный обьект: казнить нельзя помиловать

 ,


0

1

Допустим в html-странице есть следующий код

<script>
  a = 5;
  console.log(this['a']) // в консоли будет 5
</script>

если этот же код выполнить в ноде, результат будет таким же.

Внимание, вопрос: каковы могут быть причины для запрещения обращения к глобальному обьекту посредством «this»?

// имею дело с платформой, где строка «this['a'] = 5» вызывает ошибку «object does not support this property or method», а «typeof this» упорно твердит о undefined

Перемещено beastie из talks

★★★★★

Последнее исправление: ZuBB (всего исправлений: 2)
Ответ на: комментарий от noomorph

по 1му: так и не понял вашу идею. по №2: не знаю, но думаю что должен присутствовать. а как он мне поможет в данном случае?

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

Ну если вписываешь в консоль браузера:

function ZuBB() {
}

то у тебя в глобальном скопе появится функция ZuBB, которая является и объектом в том числе — в нее можно пихать все что надо. Передашь библиотеке, а она нафарширует всем необходимым.

И еще, может доступ есть просто к глобальному (тогда можно и без this обойтись)

window
?

noomorph
()
Ответ на: комментарий от ZuBB

this совпадает с тем объектом, в который замыкание загружено. Если грузить файл в браузере, то получится что this = window. В ноде будет module.exports, a не global.

Вот тут есть шаблоны оберток https://github.com/umdjs/umd , на все случаи жизни.

Ваш баг скорее всего из-за use strict, т.к. переменная не объявлена. Поставьте jshint и отлинтуйте исходники, будет намного проще и нагляднее.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Вы конечно извините, но сейчас Вы похожи на классического ЛОРовского школьника, который пользуется «тред не читай@сразу отвечай».

но я таки повторю.

у меня не нода и не браузер.

обьекта window у меня тоже нет. среда использует JS VM от встроенного MSIE. я гоняю все тесты в winxp c IE8, как на самом старом что должно поддеживатся.

«use strict»`ом у меня там и не пахнет.

по неведомой мне причине афтар того комбайна запретил явно писать в глобальный контекст.

тоесть

любая мало-мальски нормальная либа которая использует метод №2 для своей «регистрации» из Глобальный обьект: казнить нельзя помиловать (комментарий)

успешно валит мне весь «скрипт»

ZuBB ★★★★★
() автор топика
Последнее исправление: ZuBB (всего исправлений: 1)
Ответ на: комментарий от ZuBB

В яваскрипте нет однозначного определения глобального объекта. Есть контекст самого верхнего уровня. С чего вы взяли, что сможете гарантированно писать в глобальный объект - мне неведомо.

Хотите чтобы модули работали всегда и везде - используйте AMD-обертки или CommonJS и т.п. На верхнем уровне определяется require (и опционально define), и потом все модули ими пользуются для вызова-подгрузки зависимостей.

Vit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.