LINUX.ORG.RU

за что мы любим javascript

 


0

1
for(var j = 0; j < 3; j++) {
  console.log('j1 %s', j)
  for(var j = 0; j < 3; j++) {
    console.log('j2 %s', j)
  }
}



результат

j1 0
j2 0
j2 1
j2 2


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

★★★★★
Ответ на: комментарий от no-such-file

Да, но если ты собрался выкинуть var и оставить let, то это «в начале блока» и будет в начале функции. Тогда в чём разница? Размещай var в начале функции.

по поводу «в начале»: тут смысл не в «в начале», а скорее «внутри блока». Я бы сказал, в частности, let можно использовать внутри if с ожидаемым результатом.

Вообще, именно в этом и неочевидность. Когда ты пишешь,например, if , у тебя логический блок, хочешь ты того или нет. Просто потому что иф как раз для того и нужен чтобы выделить логический блок. И тебе вероятно нужны там некоторые локальные вычисления. И логично ожидать что объявив внутри логического блока нечто, ты получаешь это нечно доступное внутри логического блока.

При этом как НЕ представлять себе if как логически отдельный блок я лично с трудом понимаю (с доступом ко внешней информации, да, но главное с возможностью объявлять внутри блока локальные переменные). Т.е. то что этоможно сделать, я понимаю, вон вар к примеру. Но это и есть ошибка проектирования, прямо говоря.

По поводу твоего примера - нет,ты не прав. Интерпретатор сразу говорит об ошибке. Да, вероятно если бы конструкция выглядела вот так

{for(let i = 0;...) 
  code
}
console.log('%i ', i)


то ситуация была бы более очевидной, вероятно.

Но повторюсь, это не так важно, потому что ошибка видна почти сразу (если только не «повезло» запрятать ещё в хитрый редкий иф, но вероятность такого события меньше).

А вот в ситуации
function a1() {
  var myVarA = 0
...
function() {
  var myVarA = 1
}
}

где второй myVarA является по задумке, локальной переменной, будет довольно нетривиально скумекать, где именно ты испортил myVarA у функции a1. В целом идея что тебе надо помнить что во всех предыщущих контекстах ты нигде не назвал вот так переменную мне кажется как минимум неоднозначной и значительно сложнее той простой мысли что то что ты объявил здесь, это именно то что ты объявил здесь.

Нет,я, конечно, понимаю что можно опуститься сейчас до аргументации вида «программист должен помнить ВСЕ названия ВСЕХ переменных выше по скоупу иначе это обезьяна, а не программист. И мы таким вот образом дисциплинируем и обучаем,а необучаемые уходят..вот это вот всё». Но по-моему тут очевидно что это просто лишняя сложность и лично ты до этого вряд ли дойдёшь. ХОтя индивиды мне кажется даже в этом треде себя проявляли, способные на такие умозаключения, пмсм.

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

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

При этом как НЕ представлять себе if как логически отдельный блок я лично с трудом понимаю

Жаваскриптеры (и питонщики, кстати) привыкли именно так писать, поэтому им let как раз кажется странным. Дело привычки.

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

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

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

есть: у тебя дурацкие требования.

Да. Вот такие требования. Хочу c-like скриптуху, т.к. считаю только такие языки удобными. Дурацкие - не дурацкие - это вкусовщина и об этом не спорят.

То что я знаю как работает var не делает его ни на грамм лучше.

Докопался до какой-то мелочи. У JS есть куда более значимые проблемы.

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

Хочу c-like скриптуху

Желания есть причина страданий ((с) Будда вроде).

Не могу не заметить, как удивительно верно это изречение в контексте нашей беседы.

PS. ну и да, сочувствую, конечно.

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

Да не волнуйся, всё норм. Тебе ведь никто не мешает использовать яваскрипт.

Более того, таки хитромудрые ребята, которые хотят Idris во все поля — они сильно рискуют. Порог вхождения довольно высок, а что получится — никто не знает. Запросто может быть что весь этот запал превратиться в пшик потому что технология окажется недостаточно хороша для своей сложности (как лисп к примеру). И получится что я просто выкинул время. А его не так мало надо.

Так что не комплексуй, всё ок.

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

no-such-file, я то думаю куда ты пропал... а оно вон оно что.

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

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

Тем не менее,аргумент всё тот же: такое поведение неудобно (не логично). Блок выделяется для проведения локальных вычислений и проще и понятнее объявлять переменную здесь и знать что она объявлена здесь нежели чем получить результат как в стартовом посте.

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

я то думаю куда ты пропал...

В целом, беседа потеряла для меня интерес.

тут смысл не в «в начале», а скорее «внутри блока». Я бы сказал, в частности, let можно использовать внутри if с ожидаемым результатом

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

Интерпретатор сразу говорит об ошибке

Легче от этого не становится. А если тебе становится, то непонятно почему ты не хочешь использовать jslint как тебе уже предлагали. Всё равно ведь код будет собираться через какой-нибудь babel, так что не вижу причины не прикрутить и lint как этап сборки.

повторюсь, это не так важно

А тебя кто назначил решать что важно, а что нет?

где второй myVarA является по задумке, локальной переменной

Он и будет локальной переменной.

> function x() { var a = 1; function z() { var a = 2; console.log(a); }; z(); console.log(a); }
< undefined
> x()
2
1

Нет,я, конечно, понимаю что можно опуститься сейчас до аргументации вида «программист должен помнить ВСЕ названия ВСЕХ переменных выше по скоупу иначе это обезьяна, а не программист

Достаточно просто знать предмет о котором говоришь, чтобы не позориться.

Жаль что ты упираешься. Но психологически я тебя понимаю

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

хаскель

Я и в js могу писать как в хаскеле, или нет - по желанию. А в хаскеле можно писать только как в хаскеле. Поэтому хаскель дно и ненужен.

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

Я и в js могу писать как в хаскеле, или нет - по желанию. А в хаскеле можно писать только как в хаскеле. Поэтому хаскель дно и ненужен.

Вряд ли ты можешь писать в js как в хаскеле. Очень быстро поймаешь переполнение стека. Или это уже не актуально?

В остальном - «Л - логика», что ещё ту скажешь. Ладно, спасибо за ответ.

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

Или ты имел ввиду что я говорю о переполнении стека в ситуации когда впринципе высказана абсурдная идея, ведь на яваскрипте никак не получиться писать «как на хаскеле» в первую очередь потому что «как на хаскеле» - это сильно в сторону т.н. «type-driven-development», что на яваскрипте невозможно по определению?

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

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

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

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

_НЕ_ всегда получается сформулировать мысль сразу, конечно же

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

Хаскель это про ленивые вычисления. Ну и функциональная чистота там еще. Можно и на жс писать чисто (правда недолго, до первого IO), а вот как быть с ленью? Но вообще зачем «писать как на хаскеле»? Я тебе скажу по секрету, что и самим хаскелистам это не всегда нравится. Костылей там завались для обхода того неловкого момента, что моделируемый живой мир весь погряз в состояниях. Математики негодуют, но вот так оно. Поэтому практичные чуваки сделали ocaml, где можно писать как удобней, а акадэмики грызут свой гранит как обычно.

anonymous ()