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)

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

Потому что в жабоскрипте области определения переменных сделаны из говна и палок. В том числе this. Я бы сказал, в особенности this.

shimon ★★★★★
()

А зачем тебе в глобальный объект? Если для стейта - запили синглтон какой нибудь б-гмерзкий.

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

мне незачем. только так все делают

    var root = this
      , $ = root.jQuery || root.Zepto
      , i18n = {}
      , resStore = {}
      , currentLng
      , replacementCounter = 0
      , languages = []
      , initialized = false;


    // Export the i18next object for **CommonJS**. 
    // If we're not in CommonJS, add `i18n` to the
    // global object or to jquery.
    if (typeof module !== 'undefined' && module.exports) {
        module.exports = i18n;
    } else {
        if ($) {
            $.i18n = $.i18n || i18n;
        }

        root.i18n = root.i18n || i18n;
    }

пример взят из i18next

ZuBB ★★★★★
() автор топика

Технически, причина в том, что у тебя где-то стоит 'use strict';

Вот даже в браузере попробуй выполнить:

(function () { 'use strict'; console.log(typeof this); }())

Увидишь то же самое, что ты описываешь.

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

Ну, как же ты знаешь, что есть this, раз удивляешься, что он внезапно undefined.

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

Олсо если у тебя есть window, можешь попробовать сделать this=window, где-нибудь перед инклудами скриптов.

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

не уверен что правильно понял

«this = {}» дает «can not assign to `this`»

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

там много текста на англицком. моя голова не готова переварить его после вчерашнего

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

я таки наврал/перепутал немного. извиняюсь отходнячок еще действует

_rl(typeof this);
(function(){_rl(typeof this)})();
_rl(typeof Input);
(function(){_rl(typeof this['Input'])})();
object
object
object
undefined
ZuBB ★★★★★
() автор топика
Последнее исправление: ZuBB (всего исправлений: 1)

Вообще-то this - это ссылка на контекст. Если глобально или вызов из глобальной функции , то this == window иначе - контекст объекта.

Например:

<script>
 a = 5 
 console.log(this['a']); //будет 5
 obj = {a:6, func:function (){
   console.log(this['a']);//будет 6
 }}.func(); 
 console.log(this['a']); //будет 5  
</script>

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

this значит будет чем-то другим (содержать все глобальные переменные).

Просто посмотри в консоле console.log(this['a'],this)

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

Если нужны именно глобальные переменные, используй var root = this и затем используй root

Или передавай через apply: func.apply(this)

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

а так

for (var ii in this) { 
    _rl(ii); 
    _rl(typeof this[ii]); 
} 

получаю «object does not support this action»

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

пустой объект.

тоже склоняюсь к этому. сейчас проверю

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

я хочу заюзать сторонние либы. а вних так и делается. и не пашет ибо у меня нельзя писать в глобальный обьект посредством this

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

у меня нет консоли. единственный способ - скормить его json.stringify`ю. но тот упал по той же причине что и for.

я вспомнил что с этой радостью идет в комплекте нано-ide с возможностью дебага. оно говорит что this это обьект и больше ничего сним не может и не умеет сделать

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

var this = {};

таки получаю «identifier expected»

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

Вообще, сделай метод который отдает стейт и патчируй зависимости сторонние. Иначе видимо не взлетит.

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

Вообще, сделай метод который отдает стейт и патчируй зависимости сторонние.

не понял. обьясни попроще пожалуйста. или приведи пример с кодом

патчируй

понятно что патчированием любую бяку можна лечить, но я наоборот хочу избежать лишней работы

Иначе видимо не взлетит.

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

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

Может ты все-таки сможешь обойти острые углы? Что конкретно без глобального объекта ты считаешь нереализуемым в твоем случае?

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

помниш мой тред о либах для локализации? так вот нашел замену, а заюзать ее немогу ибо у нее (как и у всех? большых) вместо

var superlib = (function(){ return module;})()

юзается инжект в глобальный обьект

(function(){ vat root = this, root.superlib = {}; })()

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

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

ага, ясненько.

А не пройдет ли трюк типа:

function Global() {
  // пустышка, которая создаст глобально видимый объект
}

Global.superlib = {};

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

P.S. От фонаря еще одна мысля: что там с eval()? Может он развяжет тебе руки?

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

К слову в этом случае у тебя должно взлететь call/apply/bind с явной передачей контекста: (function(){ vat root = this, root.superlib = {}; }).call({})

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

да, должно взлететь. но это подразумевает патчинг. а я очень хочу его избежать.

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