История изменений
Исправление AndreyKl, (текущая версия) :
Да, но если ты собрался выкинуть 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, :
Да, но если ты собрался выкинуть 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, :
Да, но если ты собрался выкинуть 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, :
Да, но если ты собрался выкинуть 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. В целом идея что тебе надо помнить что во всех предыщущих контекстах ты нигде не назвал вот так переменную мне кажется как минимум неоднозначной и значительно сложнее той простой мысли что то что ты объявил здесь, это именно то что ты объявил здесь.
Жаль что ты упираешься.