LINUX.ORG.RU

Var в javascript

 


0

2

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

Уже в тысячный раз, наверное, я слышу мантру о том, что объявление переменной внутри функции без var приводит к созданию/переопределению свойства глобального объекта с соответствующим именем. Какая-то плюсовая обезъяна когда то сказала, а другие попугаи повторяют. И рекомендуют при этом всегда использовать var внутри функции. Это полнейшая чушь.

Начнем с того, что так называемое «объявление без var» - это никакое не объявление без вар, это деструктивное присваивание. Оно изменяет не свойство глобального объекта, а значение переменной внутри локального скопа функции. Поскольку в этот скоп входят в том числе, глобальные переменные, она может переопределить и глобальную переменную, но вовсе не обязательно.


var a = 1;
var tst = function(){var a = 2; return function(){a=3}}();
tst();
console.log(a)// ---> 1

Ну чо, переопределилось это ваше мифическое «св-во глобального объекта»? Сколько можно терпеть этот бред? Это не неочевидность, это не баг, а фича. Благодаря этому можно создавать объекты с разделяемым состоянием, c изолированным состоянием, это готовое средство для реализации объектной системы в духе классового ООП (которое нах не нужно, но это другой вопрос). Короче это одно из мощнейших средств проектирования. При этом, хомячье, даже на уровне комитетов стандартизации уже готово объявить это нужное и полезное свойство языка deprecated. Нет слов. Маразм не знает никаких границ. Наверное, правду говорят, что JS лучше изучать по книжкам про лисп.



Последнее исправление: anonimous (всего исправлений: 1)

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

Поэтому если хочешь объявить локальную переменную, не забывай писать var.

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

А неочевидность в том, что если забудешь написать var там, где var нужен, то получится бага, причём на первый взгляд незаметная.

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

PolarFox ★★★★★
()

Как потеряешь скоп из-за опечатки в сложном модуле, сразу все встанет на свои места. В луа например есть модуль strict, который отлавливает случайные глобальные присвоения и валится с ошибкой. Перл тоже в стрикте/варнингсах предупреждает об этом. А жс не предупреждает, да и модуль никто не догадался написать, вот и приходится в туториалах вдалбливать.

Про мощнейших средств это очевидно верно, т.к. полный лексический скопинг.

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

В JS лексический появился только в ES6 емнип.

Ещё хорошо сделали в го, := (или var) для объявления, = для присваивания, присваивание несуществующей переменной даёт ошибку.

PolarFox ★★★★★
()

объявить это нужное и полезное свойство языка deprecated

В руби/питоне живут без вар и ниче, в coffee живут без var и ниче. Расслабься.

with тоже почему-то не любят, например..

special-k ★★★
()

забудешь
опечатки
ide
2014

ritsufag ★★★★★
()

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

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

Плюсовая обезьяна детектед?

anonymous
()

Это тупой троллинг? Объявление переменной без var переопределяет переменную на уровень выше, объявленную с var. В вашем случае это «var a =2» в test. Если убрать там var, то будет ...

var a = 1;
var tst = function(){ a = 2; return function(){a=3}}();
tst();
console.log(a);// ---> 3
Сюрприз сюрприз.

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

Ты бы хоть постеснялся. Он написал:

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

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

А чем он отличается от

(function(){var a=1; return a}())
?

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

разработчики gnome-shell и дополнений для него смотрят на этот пост с недоумением

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