Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Можно ли объявить переменную прямо в массиве или объекте (https://javascript.ru/forum/misc/50240-mozhno-li-obyavit-peremennuyu-pryamo-v-massive-ili-obekte.html)

mkone112 18.09.2014 09:38

Можно ли объявить переменную прямо в массиве или объекте
 
Такой код не работает:
var goods = [15, 'str', var i = 5, {text : 'last element'}];

Этот код также не работает
var goods = {
	text : var i = 5
}

Можно ли объявить переменную прямо в объекте или массиве или нет?

ksa 18.09.2014 10:41

Цитата:

Сообщение от mkone112
Можно ли объявить переменную прямо в объекте или массиве или нет?

Это опять из области вероисповедания? :D

ksa 18.09.2014 10:47

Цитата:

Сообщение от mkone112
Можно ли объявить переменную прямо в объекте или массиве или нет?

Присвоение можно замастырить...

var goods = [15, 'str', (i = 5, 'test')];
alert(i);
alert(goods[2]);

mkone112 18.09.2014 11:56

Спасибо... но как я понял вы просто избавились от 'var', возможны ли какие либо последствия в виде ошибок в некоторых браузерах например? Просто здесь же в учебнике написано об необходимости использования var.

Safort 18.09.2014 12:40

Как вариант, использовать самовызываемые функции


var a = [1, 
        'два', 
        (function() { 
          var hide = 'эта переменная доступна только тут';
          window.newVar = 'Три. Привет из массива'; 
          return window.newVar; 
        }())];  

  console.log(a[2]);
  console.log(newVar);


Но при этом переменная newVar станет глобальной. Если это тебе и нужно, то ок.

ksa 18.09.2014 12:53

Цитата:

Сообщение от mkone112
в учебнике написано об необходимости использования var

Да. Дабы не засорять память и пространство имен...

И там не написано "старайтесь использовать var в любом месте"... :D
Какая выгонка использовать его при объявлении массива или объекта? Тем паче, что var может находиться в любом месте "уровня"...

petya 18.09.2014 15:04

Цитата:

Сообщение от ksa
Дабы не засорять память

Причем тут память? Вы наоборот засоряете память, так как такую переменную нельзя удалить.

ksa 18.09.2014 15:49

petya, ты меня с кем-то путаешь... :D Начни читать тему с самого начала. ;)

Erolast 18.09.2014 15:57

Цитата:

Причем тут память? Вы наоборот засоряете память, так как такую переменную нельзя удалить.
Да ну? Объявленную через var локальную переменную удалит сборщик мусора по окончании функции (если ее, конечно, ничто не замкнет). Объявленная без var так и останется висеть в глобале.

petya 18.09.2014 16:06

Я вот о чем:
var a=1
console.log(delete a)

Цитата:

так и останется висеть в глобале.
Да, это очень странно, когда создаешь свойство объекта, а это свойстао, внезапно, так и остается висеть. Непорядок.

Erolast 18.09.2014 16:23

Цитата:

var a=1
console.log(delete a)
Зачем тебе вообще удалять переменные, если это работа сборщика мусора?
Цитата:

Да, это очень странно, когда создаешь свойство объекта, а это свойстао, внезапно, так и остается висеть. Непорядок.
То, что созданная вне функций переменная становится свойством глобального объекта - это косяк архитектуры, исправленный в ES6.

petya 18.09.2014 16:28

Цитата:

это косяк архитектуры
Да, по мнению Васи Пупкина, это косяк. Поскольку, количество индусни среди разрабов JS достигло критической массы, пришла пора делать из JS очередную жабу. Этим, как раз, и занимается ES6. Конъюктура рынка.

Arramis 18.09.2014 23:37

Цитата:

Сообщение от Erolast (Сообщение 331183)
То, что созданная вне функций переменная становится свойством глобального объекта - это косяк архитектуры, исправленный в ES6.

ES6 покрайней мере в ближайшие 2 года уж точно никто не будет реально применять в проектах, а ели кто и станет то это будут скорее всего новички в js.

Safort 18.09.2014 23:52

Arramis,
2 года? Да ты шутишь, вангую к следующему лету(а то и раньше) народ начнёт перекатываться на шестую.

Arramis 19.09.2014 00:11

Цитата:

Сообщение от Safort (Сообщение 331251)
Arramis,
2 года? Да ты шутишь, вангую к следующему лету(а то и раньше) народ начнёт перекатываться на шестую.

а писать всё равно будут по старому :lol:

Aetae 19.09.2014 05:51

Arramis, ну ну. Вон товарищ kobezza пилит себе спокойненько свой проект на es6. Сейчас для запуска просто пользуется компиляцией в es5, а как везде появится поддержка - просто выкинет этап компиляции.
Абсолютно адекватный подход.

Даже мне уже порой лениво писать вместо
([{prop:foo}]) => this.bar+foo
function(foo){
  return this.bar+foo[0].prop
}.bind(this)

Не говоря уже о таких прекрасных штуках как WeakMap, или генераторы(коими я проникся пока только наполовину):)

kostyanet 19.09.2014 07:47

А Хром нипонял без слова function. У меня было так

...
prop:return this.prop1/some_var,
...

В ФФ все молчали, а в Хроме разорались, пришлось завернуть боты

prop:function()...

Erolast 19.09.2014 11:52

Цитата:

ES6 покрайней мере в ближайшие 2 года уж точно никто не будет реально применять в проектах, а ели кто и станет то это будут скорее всего новички в js.
Бред. ES6 слишком вкусен, чтобы кто-то отказался им пользоваться (ну, не беря в расчет вынужденных поддерживать IE), а релиз уже в декабре. А некоторые, как сказал Aetae, так и уже пользуются через компиляцию (я лично в том числе).

Arramis 19.09.2014 22:38

Erolast,
я не про отказ говорил, никто и не спорит что на es6 удобнее будет писать, но дело в том сколько уйдёт времени чтобы привыкнуть полностью, да и вобще нынче стало модным добавлять лямбды в императивные языки, везде уже есть - в c++, c# теперь и в js впихнули... надоело

Aetae 20.09.2014 00:03

Arramis, к хорошему быстро привыкаешь. См. выше.)

petya 20.09.2014 00:06

Цитата:

Сообщение от Arramis
теперь и в js впихнули... надоело

А когда их там не было?

Arramis 20.09.2014 00:48

Цитата:

Сообщение от petya (Сообщение 331484)
А когда их там не было?

а что по твоему js это чисто функциональный язык ?

petya 20.09.2014 00:49

Arramis,
Нет, я спрашиваю, когда в JS не было лямбд? Лет 20 назад? 30? Причем тут новый стандарт? Какие он лямбды еще вводит, помимо тех которые уже есть?

Собственно, лямбды в JS ,с самого начала, он с ними появился. Где то я читал, что там изначально не было лексических замыканий. Но это было очень давно.

Arramis 20.09.2014 00:57

petya,
то что ты называешь в js лямбда выражениями это не совсем то что в фукнциональных языках.

petya 20.09.2014 01:02

Arramis,
Ты не мог бы ясней выражаться, чем отличаются лямбды в ФЯ от остальных лямбд? Очень интересно.

Arramis 20.09.2014 01:07

Цитата:

Сообщение от petya (Сообщение 331495)
Arramis,
Ты не мог бы ясней выражаться, чем отличаются лямбды в ФЯ от остальных лямбд? Очень интересно.

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

petya 20.09.2014 01:11

Arramis,
Это никакого отношения к определению лямбд не имеет. Лямбды -- это первоклассные функции, как правило, безымянные, и ничего более. Остальное -- это твои фантазии.

petya 20.09.2014 01:12

Цитата:

Сообщение от Arramis
ничего не возвращая

В JS функции всегда возвращают undefined, кстати, если явный возврат не определен.

Arramis 20.09.2014 01:17

petya,
отношение имеет такое что лямбда это такая же функция как и любая другая, когда ты создаешь безымянную функцию её безымянность исчезает в процессе компиляции иначе как бы виртуальня машина вызывалала её без идентификатора ?? всевышний чтоли это делает по твоему ? всё мною вышесказанное имеет место быть, иди учи основы

petya 20.09.2014 01:17

Цитата:

Сообщение от Arramis
ничего не возвращая

Кстати, любопытно, а что в ФЯ возвращает функция foreach?

petya 20.09.2014 01:20

Arramis,
Еще раз: ты говоришь о чем то другом. Само понятие лямбда-выражение, появилось задолго до появления быдло-ФП, оно появилось в лиспах.

Arramis 20.09.2014 01:21

Цитата:

Еще раз: ты говоришь о чем то другом. Само понятие лямбда-выражение, появилось задолго до появления быдло-ФП, оно появилось в лиспах.
а это еще к чему ?

petya 20.09.2014 01:23

Цитата:

Сообщение от Arramis
безымянность исчезает

И при чем тут вообще безымянность, епт, безымяность это только когда удобней не навешивать имя, это не обязательное, вообще условие. Обязательное -- что она первоклассна.


Часовой пояс GMT +3, время: 11:47.