Я не могу понять, почему переменные действуют так странно, когда объявлены внутри функции.
В
first
функции, которую я объявляю сlet
переменнымиb
иc
со значением 10 :b = c = 10;
В
second
функции я показываю:b + ", " + c
И это показывает:
10, 10
Также в
first
функции я объявляюa
со значением 10 :let a = b = c = 10;
Но в
second
функции это показывает ошибку:Не могу найти переменную:
a
Теперь в
first
функции я объявляюd
со значением 20 :var d = 20;
Но в
second
функции она показывает ту же ошибку, что и раньше, но с переменнойd
:Не могу найти переменную:
d
Пример:
function first() {
let a = b = c = 10;
var d = 20;
second();
}
function second() {
console.log(b + ", " + c); //shows "10, 10"
try{ console.log(a); } // Rreference error
catch(e){ console.error(e.message) }
try{ console.log(d); } // Reference error
catch(e){ console.error(e.message) }
}
first()
b
иc
не предваряетсяvar
ключевым словом.a
иd
являются местными дляfirst
.Dim Apple, Banana, Pear As Fruit
значитDim Apple / Dim Banana / Dim Pear As Fruit
, а нетDim Apple As Fruit / ...
.Ответы:
Это потому, что вы на самом деле говорите:
И не то, что вы думаете, что говорите, а именно:
Вы заметите, что независимо от того, сколько переменных вы добавляете в свою цепочку, только первая (а) вызывает ошибку.
Это потому, что «let» определяет область видимости вашей переменной в блоке (или «локально», более или менее означающем «в скобках»), в котором вы ее объявляете.
Если вы объявляете переменную без «let», она охватывает область глобально.
Итак, в функции, в которой вы устанавливаете свои переменные, все получает значение 10 (вы можете увидеть это в отладчике, если вы установите точку останова). Если вы поместите консольный журнал для a, b, c в эту первую функцию, все будет хорошо.
Но как только вы покидаете эту функцию, первая (а) - и опять же, имейте в виду, технически в порядке назначения, она последняя - «исчезает» (опять же, вы можете увидеть это в отладчик, если вы установили точку останова во второй функции), но другие два (или сколько вы добавляете) по-прежнему доступны.
Это связано с тем, что «let» ТОЛЬКО ПРИМЕНЯЕТСЯ (так что только локально ограничивает) ПЕРВОЙ ПЕРЕМЕННОЙ - опять же, которая технически является последней, которая будет объявлена и ей присвоено значение - в цепочке. У остальных технически нет «пускай» перед ними. Так что они технически объявлены глобально (то есть в глобальном объекте), поэтому они появляются в вашей второй функции.
Попробуйте: удалите ключевое слово let. Все ваши варианты теперь будут доступны.
«var» имеет аналогичный эффект локальной области видимости, но отличается тем, как переменная «поднимается», что вам определенно нужно понять, но которое напрямую не связано с вашим вопросом.
(Кстати, этот вопрос достаточно озадачил бы разработчиков JS, чтобы сделать его хорошим).
Настоятельно советуем вам потратить время на различия в том, как переменные могут быть объявлены в JS: без ключевого слова, с «let» и с «var».
источник
var
болееlet
в контексте этого ответа? Я не понимаюvar
может быть подвержен ошибкам, если используется небрежно. Проверьте эту скрипкуvar
имеет какое-либо преимущество передlet
? Позвольте мне уточнить: современный контекст, когда оба варианта являются опциями, и я прошу код, который нужно написать. Когда я спрашивал об этом раньше, я получал ответы о «вы можете повторно объявить переменную с помощьюvar
», и в этом случае я должен напомнить людям, что вы не должны повторно объявлять переменные . Это либо ошибка, либо ошибка в логике кода - так что преимущество повторного объявления заключается в том ... что он позволяет писать ошибочный код. Я еще не видел какой-либо разумной причины в пользу того,var
когдаlet
это тоже вариант.В функции
first()
переменныеb
иc
создаются на лету, без использованияvar
илиlet
.Отличается от
Они становятся неявными глобальными. Вот почему они доступны в
second()
Из документации
Чтобы избежать этого, вы можете использовать метод,
"use strict"
который будет выдавать ошибки при использовании необъявленной переменнойисточник
let a = 10, b = 10, c = 10;
илиlet a, b, c; a = b = c = 10;
иначе был бы правильный способ объявления переменных.b
не будет оценена / достигнута, ошибка произойдет в строкеlet a = b = c = 10;
, прочитанной справа налево .c
Будучи первой вызывающей переменнойReferenceError
, оставшаяся часть строки не будет выполнена (сценарий остановлен)let a = 10, b = a, c = b;
тоже действительноПрежде чем называть вещи странными, давайте сначала узнаем некоторые основы:
var и let оба используются для объявления переменных в JavaScript. Например,
Переменные также могут быть объявлены без использования
var
илиlet
. Например,Теперь разница между вышеуказанными подходами заключается в том, что:
var
является функцией областиа также
let
находится в блокеТеперь в соответствии с этими концепциями давайте посмотрим на рассматриваемый код:
источник
var
ключевого слова, становится глобальной независимо от того, где оно объявлено», должно быть либо «область действия… становится», либо « прицелы ... становятся " . Использование точных чужих слов требует цитирования, будь то здесь или где-то еще. meta.stackexchange.com/q/160071/211183Переменные, использующие
let
ключевое слово, должны быть доступны только в пределах блока и не доступны во внешней функции ...Каждая переменная, которую вы объявляете таким образом, не использует
let
илиvar
. Вам не хватает запятой в объявлении переменных.Это не рекомендуется , чтобы объявить переменную без
var
ключевого слова. Он может случайно перезаписать существующую глобальную переменную. Область действия переменных, объявленных безvar
ключевого слова, становится глобальной независимо от того, где оно объявлено. Глобальные переменные могут быть доступны из любой точки веб-страницы.источник
Это из-за того, что когда вы не используете
let
илиvar
тогда переменная становится объявленной на лету, лучше объявить следующим образом.источник
Странная проблема вызвана ограничением правил в JavaScript
Предполагая, что вы хотите объявить 3 локальные переменные, инициализированные одним и тем же значением (100). Ваша первая () будет выглядеть ниже. В этом случае second () не будет иметь доступа ни к одной из переменных, потому что они локальны для first ()
Однако, если вам нужны глобальные переменные, ваш first () будет выглядеть следующим образом. В этом случае секунда будет иметь доступ ко всем переменным, потому что они находятся в глобальной области видимости.
Локальные переменные (ака. Доступны в блоке кода, где они объявлены).
Блок кода - это любой {} со строкой кода между.
Глобальные переменные (они также доступны в глобальной области видимости).
Эти переменные привязаны к глобальному объекту. Глобальный объект зависит от окружающей среды. Это оконный объект в браузерах.
Специальное примечание: Вы можете объявлять переменные в JavaScript без использования ключевых слов var, let, const. Объявленная таким образом переменная присоединяется к глобальному объекту, поэтому доступна в глобальной области видимости.
a = 100 // is valid and is in global scope
Некоторые статьи для дальнейшего чтения: https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/ https://scotch.io/tutorials/understanding-scope-in-javascript https: //www.digitalocean .com / сообщества / учебники / понимание-переменные-Scope подъемно-в-JavaScript
источник
Основное отличие заключается в правилах определения объема. Переменные, объявленные ключевым словом var, попадают в область непосредственного тела функции (отсюда область действия функции), а переменные let - в область непосредственного включения, обозначенную {} (отсюда область действия блока). И когда вы говорите
c и b имеют такой же жизненный цикл, как и забавный, но имеют только блок с продолжительностью блока, и если вы пытаетесь получить доступ к a, ссылаясь на него, всегда показывает ошибку, но c и b глобально, поэтому их нет. Вы заметите, что независимо от того, сколько Переменные, которые вы добавляете в свою цепочку, это будет только первая (а), которая вызывает ошибку. Это потому, что «let» определяет вашу переменную в блоке (или, «локально», более или менее означает «в скобках») в котором вы объявляете его. Если вы объявляете переменную без «let», она определяет глобально переменную. Так, в функции, в которой вы устанавливаете переменные, все получает значение 10 (вы можете увидеть это в отладчике, если вы поставите Распад точка). Если вы поместите консольный журнал для a, b, c в эту первую функцию, все будет хорошо. Но как только вы выйдете из этой функции, первая (a) - и снова, имейте в виду,
источник
Вот три интересных аспекта объявления переменных в JavaScript:
var ограничивает область видимости переменной блоком, в котором она определена. ( 'var' для локальной области .)
let допускает временное переопределение значения внешней переменной внутри блока.
Простое объявление переменной без var или let сделает переменную глобальной, независимо от того, где она объявлена.
Вот демонстрационная версия let , которая является последним дополнением к языку:
Вывод:
Объяснение:
Переменные a и b были разделены внутри first () , без ключевых слов var или let.
Следовательно, a и b являются глобальными и, следовательно, доступны по всей программе.
В функции с именем 'second' оператор 'let a = 5' временно устанавливает значение ' a ' в ' 5 ', только в рамках функции.
Вне области применения ' second () ', IE, в глобальной области видимости значение ' a ' будет таким, как определено ранее.
источник