Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   где еще используется VAR ? (https://javascript.ru/forum/misc/48246-gde-eshhe-ispolzuetsya-var.html)

nverv 26.06.2014 15:58

где еще используется VAR ?
 
1) создание глобальных и локальных переменных {функций}
2) локальные переменные в циклах for и for in
...

Dandy 26.06.2014 16:53

вопрос какой-то странный.
var используется при создании переменных.
и почему вы разделяете локальные переменные и локальные переменные в циклах?

MallSerg 26.06.2014 16:55

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

nverv 26.06.2014 17:25

Цитата:

Сообщение от MallSerg (Сообщение 318096)
Вся суть в том что var задает область видимости переменной в сочетании с замыканиями это простой понятный и очень мощный инструмент.

да! это просто и мощно и круто

спасибо :thanks: но я не об этом

про локальные переменные скрытые в функциях и циклах for / for in я всё понимаю
вопрос - где еще бывают ли

Aetae 26.06.2014 19:47

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

Кстати в отличие от других языков локальные переменные задаются всегда на уровне функции. Т.е. даже если вы задаёте переменную в цикле она доступна и далее в функции:
(function(){
    for(var i = 0; i < 2; i++) {};
    alert(i);
}())
потому ваш вопрос особенно абсурден.

P.S. Для полной картины стоит сказать что js не стоит на месте, и в современных браузерах уже доступны помимо var: let и const, первый создаёт переменную на уровне блока, второй, соответственно, константу.

nerv_ 26.06.2014 21:29

Цитата:

Сообщение от nverv
где еще используется VAR ?

СамоVAR
БульVAR
VARVAR
:)

MallSerg 26.06.2014 22:00

Цитата:

Сообщение от nverv
про локальные переменные скрытые в функциях и циклах for / for in я всё понимаю

сильно сомневаюсь.
Возможно поможет статья http://javascript.ru/basic/closure#scope

nverv 26.06.2014 22:12

ну я вроде правильно мыслю - в глобальном пространстве не использовать var
а только в функциях и циклах
больше то негде же

Цитата:

Сообщение от Aetae (Сообщение 318114)
Кстати в отличие от других языков локальные переменные задаются всегда на уровне функции.

а если цикл не внутри функции ? тогда где находится локальная переменная объявленная внутри цикла

Erolast 26.06.2014 22:31

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

Ты, по-моему, мудришь. var - это просто объявление переменной. Вот в си есть int, char, float, double, а тут только var, ибо типизация в javascript динамическая. Видна эта переменная будет в той области видимости, в которой она объявлена, как и в том же си. Область видимости в javascript задается функциями, а не блоками, как в си, потому объявленная в цикле переменная будет видна в той же функции, где распологается сам цикл, да. Используется var, разумеется, везде. Как ты иначе собираешься объявлять переменные?

BETEPAH 26.06.2014 22:40

Цитата:

Сообщение от nverv
а только в функциях и циклах

цикл не создает область видимости. Отстаньте от него :)

MallSerg 26.06.2014 23:04

В компилируемых языках переменные создают реальные объекты в js переменные это всегда свойства какого либо объекта любое объявление var расширяет скоп(специальный объект) текущей функции
т.е. все переменные находятся в одной большой древовидной структуре

foo 27.06.2014 09:28

Цитата:

Сообщение от nverv (Сообщение 318083)
1) создание глобальных и локальных переменных {функций}

Только локальных в ф-циях. В глобальной области можно и без вар, разница только в том, что с вар не удаляются delete, причем, в некоторых реализациях, например в node, объявленная с var переменная не копируется в global, поэтому, наверное, в глобальной области без var даже лучше.

Erolast 27.06.2014 11:32

Цитата:

Только локальных в ф-циях.
Нет.

Цитата:

В глобальной области можно и без вар
Это пережиток былого. В современном javascript при объявлении переменных ВСЕГДА нужно использовать var (ну либо const/let). Попробуй объявить без var в строгом режиме - и интерпретатор радостно выдаст ошибку.
"use strict";

try {
  somevar = 100;
} 
catch (e) {
  alert(e);
}

Цитата:

в некоторых реализациях, например в node, объявленная с var переменная не копируется в global
Потому что в node.js область видимости текущего скрипта не равна глобальной области видимости. Каждый модуль создает свою область видимости.

Цитата:

поэтому, наверное, в глобальной области без var даже лучше.
strict mode с тобой не согласен.

foo 27.06.2014 11:47

Цитата:

Сообщение от Erolast
Нет.

Да
Цитата:

Сообщение от Erolast
при объявлении переменных ВСЕГДА нужно использовать var

Нет
Цитата:

Сообщение от Erolast
Попробуй объявить без var в строгом режиме

Мне плевать на него
Цитата:

Сообщение от Erolast
Каждый модуль создает свою область видимости.

Да, но это отношения к делу не имеет
Цитата:

Сообщение от Erolast
strict mode

см выше

Erolast 27.06.2014 12:10

Цитата:

Да, но это отношения к делу не имеет
Имеет. В node.js любой исполняемый скрипт сам по себе является модулем. Любой модуль создает область видимости. Когда ты создаешь файл index.js и запускаешь его через ноду - код исполняется не в глобальной области видимости, а в области видимости текущего модуля, то есть, index.js

Цитата:

Мне плевать на него
То есть, ты признаешь ранние стандарты, а на современные тебе плевать?) Ну-ну, продолжай в том же духе.

kobezzza 27.06.2014 12:14

Erolast, забей на него, каждый месяц на JS.ru появляется очередной диванный теоретик, который всех учит как надо писать код :)

ЗЫ: надо бы создать раздел в форуме: "Диванные теории".

foo 27.06.2014 12:16

Цитата:

Сообщение от Erolast
а в области видимости текущего модуля, то есть, index.js

Ты хочешь сказать, что в индексе нет глобального скопа?

foo 27.06.2014 12:23

Цитата:

Сообщение от kobezzza
Диванные теории

Диванная практика рулит, я в курсе.

nverv 27.06.2014 12:31

Цитата:

Сообщение от Erolast (Сообщение 318204)

Это пережиток былого. В современном javascript при объявлении переменных ВСЕГДА нужно использовать var (ну либо const/let). Попробуй объявить без var в строгом режиме - и интерпретатор радостно выдаст ошибку.

вы чо там в интернете совсем охринели чтоли ?!

это же прелесть жаваскрипта - в возможности простого объявления переменных

следовательно вопрос - ограничивать ли себя строгим режимом? кому это нафиг нужно?
что за странное ожидание апокалипсиса запрещающего тебе синтаксический сахар

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

зачем тогда оператор удаления

nverv 27.06.2014 12:32

Цитата:

Сообщение от foo (Сообщение 318226)
Диванная практика рулит, я в курсе.

диванная аналитика!

и диванное же программирование геополитики

foo 27.06.2014 12:46

Цитата:

Сообщение от nverv
неужели так будет что нельзя будет написать создавать переменную просто так - this.x

Там в JS, идут, как бы параллельно 2 парадигмы, smalltalk-style и быдло-lisp-style(aka scheme) и они пересекаются и конфликтуют между собой. Хорошо бы выкинуть всю схему, и оставить один смаллток. Но современные оптимизации, к сожалению, не расчитаны на динамику, поэтому крен идет в сторону быдлосхемы. Так вот, this.x=, это, строго говоря, не объявление переменной, а отправка сообщения объекту.:)

Erolast 27.06.2014 12:59

Цитата:

это же прелесть жаваскрипта - в возможности простого объявления переменных
Без var? Когда ты объявляешь переменную без var, ты объявляешь ее в глобальном пространстве, при этом засирая его. При работе над более или менее крупным проектом сразу начнутся проблемы.

Цитата:

следовательно вопрос - ограничивать ли себя строгим режимом? кому это нафиг нужно?
что за странное ожидание апокалипсиса запрещающего тебе синтаксический сахар
Строгий режим - режим соответствия современным стандартам. Рано или поздно на эти современные стандарты перейдут все браузеры.

Цитата:

неужели так будет что нельзя будет написать создавать переменную просто так - this.x
Кхм, ты что, таким образом переменные объявляешь? Не надо так)

nverv 27.06.2014 14:22

Цитата:

Сообщение от foo (Сообщение 318230)
Там в JS, идут, как бы параллельно 2 парадигмы, smalltalk-style и быдло-lisp-style(aka scheme) и они пересекаются и конфликтуют между собой. Хорошо бы выкинуть всю схему, и оставить один смаллток. Но современные оптимизации, к сожалению, не расчитаны на динамику, поэтому крен идет в сторону быдлосхемы. Так вот, this.x=, это, строго говоря, не объявление переменной, а отправка сообщения объекту.:)

вот в этом то и дело
и я хочу понять откуда ноги растут

пжста подробнее расскажи на примере синтаксисов

кстати - var - с его помошью также можно засрать глобальное пространство

nverv 27.06.2014 14:29

как я понимаю - var - он для функций, локальная переменная
нет смысла его использовать в глобальном пространстве, он только для функция для скрытия области видимости

для создания именованых контейнеров в глобале используется глобальный метод:
Object.defineProperty(объект, контейнер, значение)

или синтаксический сахар:
объект.контейнер = значение


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

как же учить язык когда говорят - "на тебе такую функциональность но лучше ее не используй"

foo 27.06.2014 14:58

Цитата:

Сообщение от nverv
подробнее расскажи на примере синтаксисов

Ну, грубо говоря, если бы мы убрали все функции с локальным скопом, мы бы использовали только объектную нотацию и функции без лексических областей, мы бы получили смолток, а если наоборот, убрать объекты, и оставить функции с лексическим скопом, у нас был бы scheme. Иными словами ФП vs прототипное ООП. Синтаксис - это собственно литералы объектов и обычные функции.

Цитата:

Сообщение от nverv
с его помошью также можно засрать глобальное пространство

Например?

Erolast 27.06.2014 15:07

Цитата:

как я понимаю - var - он для функций, локальная переменная
нет смысла его использовать в глобальном пространстве, он только для функция для скрытия области видимости
Тебе уже сказали - смысл есть, ибо правилами указано. Без var объявлять можно лишь потому, что это оплошность ранних стандартов.
Цитата:

Erolast, забей на него, каждый месяц на JS.ru появляется очередной диванный теоретик, который всех учит как надо писать код
А я знание терминологии и тонкостей языка оттачиваю :)

foo 27.06.2014 15:11

Цитата:

Сообщение от Erolast
это оплошность ранних стандартов.

Это не оплошность ранних стандартов. Я где то читал, что в раннем js вообще не было замыканий. Этот вопрос не стоял вообще. Это теперешний стиль -- оплошность и уступка хлопающему глазами плюсовому быдлу. Настоящая суть js -- это объекты.

Erolast 27.06.2014 15:13

Цитата:

Это не оплошность ранних стандартов.
Да, это пережиток ранних стандартов.

nverv 27.06.2014 15:15

Цитата:

Сообщение от foo (Сообщение 318269)
Это не оплошность ранних стандартов. Я где то читал, что в раннем js вообще не было замыканий. Этот вопрос не стоял вообще. Это теперешний стиль -- оплошность и уступка хлопающему глазами плюсовому быдлу. Настоящая суть js -- это объекты.

согласен!

также замыканиями чудовищно усложняется по сути простейший язык

nverv 27.06.2014 15:20

Цитата:

Сообщение от foo (Сообщение 318263)
Ну, грубо говоря, если бы мы убрали все функции с локальным скопом, мы бы использовали только объектную нотацию и функции без лексических областей, мы бы получили смолток, а если наоборот, убрать объекты, и оставить функции с лексическим скопом, у нас был бы scheme. Иными словами ФП vs прототипное ООП. Синтаксис - это собственно литералы объектов и обычные функции.

я не понял, а сам способ создания переменной в виде: "объект.переменная" - он из какого языка пришел к нам?

Цитата:

Сообщение от foo (Сообщение 318263)
Например?

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

Erolast 27.06.2014 15:21

Пришли два пацана на форум программистов и начали всех учить правильному коду. Збс.

nverv 27.06.2014 15:23

Цитата:

Сообщение от Erolast (Сообщение 318274)
Пришли два пацана на форум программистов и заявили, что тут все неправильно кодят на неправильно составленном языке. Збс.

да нет жешь, наоборот шобы понять основы языка, ибо в учебниках не понятно

вот ты мне скажи - зачем разделять переменные от свойств
вот балин не врубаюсь

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

и всё

Erolast 27.06.2014 15:25

Тебе объяснили эти основы, я лично аж несколько раз. var использовать надо обязательно, ибо это стандарт. Ты с foo напару упорно твердишь, что мы тут все неправы и он не нужен. Прелестно, чо.

Erolast 27.06.2014 15:28

Цитата:

вот ты мне скажи - зачем разделять переменные от свойств
Затем, что это разные сущности.

nverv 27.06.2014 15:30

Цитата:

Сообщение от Erolast (Сообщение 318277)
Тебе объяснили эти основы, я лично аж несколько раз. var использовать надо обязательно, ибо это стандарт. Ты с foo напару упорно твердишь, что мы тут все неправы и он не нужен. Прелестно, чо.

тут ты не прав

создавать можно и Варом и методом добавтьСвойство - результат одинаковый за исключением параметра Неудаляемый

foo 27.06.2014 15:30

Цитата:

Сообщение от Erolast
Да, это пережиток ранних стандартов.

На самом деле, откуда идут корни проблемы. Объявление без var соответствует оператору set! из scheme -- это оператор деструктивного присваивания. Обьявление без вар не модифицирует глобальную область, он модифицирует низлежащее лексическое окружение. Если бы программисты JS это понимали, они бы не стреляли себе в ногу,


counterMaker=function(start){return function(){console.log(start++)}}
counter=counterMaker(5)

counter()
counter()
counter()
//--------------\  
5
6
7

Это ф-ция с состоянием, и она не засирает глобал, хотя никакого вар тут нет, синтаксически. Все проблемы от непонимания инструмента.

foo 27.06.2014 15:32

Цитата:

Сообщение от nverv
варом создаю глобальные переменные, и постепенно образуется бардак
то есть вар это не решение проблемы засирания, это другая история

Не, там они, эти комитетчики и прочие, видят проблему в том, что глобал засирается неявно. То что явно определено в глобале, об этом речи нет

nverv 27.06.2014 15:33

Цитата:

Сообщение от Erolast (Сообщение 318279)
Затем, что это разные сущности.

есть две сущности -
1) иерархия объектов внутри глобального объекта (создаются методом добавитьСвойство)
2) локальные переменные подпрограмм (создаются Варом)

вот это настоящая правда-истина

Erolast 27.06.2014 15:35

Цитата:

создавать можно методом добавтьСвойство
При чем тут метод defineProperty, если ты о нем, когда мы говорим о переменных? :blink:

Цитата:

есть две сущности -
1) иерархия объектов внутри глобального объекта (создаются методом добавитьСвойство)
2) локальные переменные подпрограмм (создаются Варом)

вот это настоящая правда-истина
Да, правильно. Ну, почти. defineProperty используется для того, чтобы при объявлении свойства установить на него какие-либо флаги. Свойства объявляются обычно так:
var some_object = {};
some_object.property = 10;

nverv 27.06.2014 15:36

Цитата:

Сообщение от Erolast (Сообщение 318284)
При чем тут метод defineProperty, если ты о нем, когда мы говорим о переменных? :blink:

что такое переменная?! если не просто именованный контейнер, адрес относительно глобального корня

о чем мы спорим?


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