Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Разница между переменной с var и без, которые в глобальной области (https://javascript.ru/forum/misc/54356-raznica-mezhdu-peremennojj-s-var-i-bez-kotorye-v-globalnojj-oblasti.html)

zhurchik 14.03.2015 12:46

Разница между переменной с var и без, которые в глобальной области
 
Приветствую всех.
Вот я почитал о переменных и их областях видимости, по сути, понимаю как работают локальные переменные, а как глобальные, но мне не понятно, какая разница, если задать переменную с VAR вне функции или метода, а в глобальной видимости? Какая разница будет между переменной с VAR и без?

ruslan_mart 14.03.2015 13:13

zhurchik, без var - это не правильно, в старых браузерах или в строгом режиме будет вызвана ошибка.

zhurchik 14.03.2015 13:20

Ruslan_xDD,
То-есть, переменную вообще без var не рекомендуется писать?
А если я хочу задать глобальную переменную из функции?

Rise 14.03.2015 14:19

zhurchik,
Цитата:

А если я хочу задать глобальную переменную из функции?
А зачем это надо?

danik.js 14.03.2015 14:20

Цитата:

Сообщение от Ruslan_xDD
в старых браузерах ... будет вызвана ошибка.

Да вроде не будет. Будет только в старых IE, если на странице будет элемент с таким id. Но блин, какой смысл писать без var?

ruslan_mart 14.03.2015 15:33

danik.js, помню как-то забыл объявить переменную и в файрфоксе старом не работало, и долго гадал почему не работает. :)

Цитата:

Сообщение от zhurchik
А если я хочу задать глобальную переменную из функции?

Ну так задай:

var foo;

function myFunc() {
    foo = 'bar';
};

myFunc();
alert(foo);



function myFunc() {
    window.foo = 'bar';
};

myFunc();
alert(foo);


Но засирать глобал я бы вообще не рекомендовал.

hhh 14.03.2015 16:37

var message = 'За пределами функции';

    function warning() {
      var message = 'Внутри функции';
      alert(message); // Внутри функции
    }
    warning();
    alert(message) // За пределами функции


var message = 'За пределами функции';

    function warning() {
      message = 'Внутри функции';
      alert(message); // Внутри функции
    }
    warning();
    alert(message) // Внутри функции

Erolast 14.03.2015 18:56

Цитата:

То-есть, переменную вообще без var не рекомендуется писать?
Начиная с ES5 переменную без var запрещено объявлять.
'use strict';
dickLength = 10; //Exception: assignment to undeclared variable dickLength

nbq 14.03.2015 20:30

Разница в том, что перменную с var невозможно удалить в v8. В FF вроде удаляется.
var a = 1
b=2
console.log(delete a, delete b)

еще в старых ie ошибки были из-за этого, просто в силу тупизны самих движков ie, у них там "свой" M$ecmascript(TM):)

nbq 14.03.2015 20:38

Цитата:

Сообщение от Erolast
Начиная с ES5 переменную без var запрещено объявлять.

а если "use strict" убрать?

можно пруф, где написано, что запрещено?

В любом случае, обойти это легко, можно писать window.a=1, будет тоже самое, что без var.

nbq 14.03.2015 20:46

Цитата:

Сообщение от zhurchik
А если я хочу задать глобальную переменную из функции?

можешь написать window.a=...
а чтобы не писать каждый раз window, напиши вначале скрипта w=window

а внутри ф-ции w.a=...

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

Erolast 14.03.2015 21:17

Цитата:

Сообщение от nbq
а если "use strict" убрать?

use strict - это режим соответствия стандарту ES5. Неудачное название, да, очевидней бы было 'use ES5', но уж как есть.

Цитата:

Сообщение от nbq
можно пруф, где написано, что запрещено?

Цитата:

Сообщение от спецификация
When an assignment occurs within strict mode code, its LeftHandSide must not evaluate to an unresolvable reference. If it does a ReferenceError exception is thrown upon assignment.

https://people.mozilla.org/~jorendor...ml#sec-11.13.1, примечание.

Цитата:

Сообщение от nbq
Разница в том, что перменную с var невозможно удалить

delete предназначен для удаления свойств, а не переменных
Цитата:

Сообщение от спефикация
When a delete operator occurs within strict mode code, a SyntaxError exception is thrown if its UnaryExpression is a direct reference to a variable, function argument, or function name.

https://people.mozilla.org/~jorendor...tml#sec-11.4.1, примечание.

Цитата:

Сообщение от nbq
обойти это легко, можно писать window.a=1

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

Erolast 14.03.2015 21:18

Цитата:

чтобы не писать каждый раз window, напиши вначале скрипта w=window
Чтобы не писать каждый раз window, поставь себе редактор с автодополнением и сниппетами. Тот, кто будет читать этот код
w.one = 10;
w.second = 20;

ниуя не поймет, чо творится.

Erolast 14.03.2015 21:22

Цитата:

Но засирать глобал я бы вообще не рекомендовал.
...дополню:
http://www.2ality.com/2014/09/es6-modules-final.html
http://webpack.github.io/
http://browserify.org/
http://requirejs.org/

nbq 14.03.2015 21:27

Цитата:

Сообщение от Erolast
When an assignment occurs within strict mode code, its LeftHandSide must not evaluate to an unresolvable reference. If it does a ReferenceError exception is thrown upon assignment.

Ну, как я и говорил, только в strict mode

Erolast 14.03.2015 21:32

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

nbq 14.03.2015 21:35

Цитата:

Сообщение от Erolast
строгий режим - это режим соответствия стандарту ES5

То есть, когда он будет введен, use strict писать не надо? Все будет работать в strict mode по дефолту?

Erolast 14.03.2015 21:37

Цитата:

То есть, когда он будет введен, use strict писать не надо? Все будет работать в strict mode по дефолту?
ES5 введен уже как кучу лет, но из-за опасности поломки уже существующих сайтов сделать его семантику дефолтной нельзя, потому и придумали strict mode. В общем-то, это аналог смены мажорной версии.

nbq 14.03.2015 21:38

Цитата:

Сообщение от Erolast
говнокодить

>>говнокодить
Насчет говнокода я бы поспорил. Есть куча языков, где нет никаких варов, и прекрасно обходятся. Конкретно в JS он нужен для локальных переменных. Зачем его в глобальную область притянули -- вообще не понятно. Возможно, что-то связано с производительностью, либо, какие то скрытые дыры в дизайне.

Erolast 14.03.2015 21:53

Цитата:

Есть куча языков, где нет никаких варов, и прекрасно обходятся
Да, транслирующийся в JS coffeescript - тому пример. Но это другие языки, с другой архитектурой и в другом стиле, глупо накладывать их на JS.

Цитата:

Зачем его в глобальную область притянули -- вообще не понятно.
1. Внешний скоп далеко не всегда глобален.
2. Очевидно, для единого стиля.

danik.js 15.03.2015 05:30

Цитата:

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

Ага. Учитывая что в ES3 можно писать без варов, разработчики ES5 подумали и сказали: "А почему бы нам не добавить скрытую дыру в дизайн? Давайте сделаем var'ы обязательными!". :D


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