#javascript #variables
#javascript #переменные
Вопрос:
function myFunction(let name){
console.log("hello " name);
}
myFunction("adi");
Приведенный выше код выдает ошибку. Почему?
Комментарии:
1. Это синтаксис языка.
2. Какой в этом смысл? Разница между
let
иvar
заключается в том, является ли это областью блока или областью функции. Но для параметра функции это одно и то же.3. в этом отношении const может быть полезен, хотя: p
4. Аргументы автоматически объявляются внутри.
Ответ №1:
let
и const
являются относительно новыми функциями в языке, они были добавлены в ECMAScript 6. До этого все переменные были либо глобальными, либо локальными для функции. В теле функции вы объявляете локальные переменные var
, но параметры автоматически являются локальными, поэтому ключевое слово не требуется, чтобы отличать их от глобальных переменных.
Когда let
и const
были добавлены в язык, не было необходимости изменять способ объявления параметров. Различие между let
и var
бесполезно: let
для объявления переменных с блочной областью, но блок для параметра функции такой же, как и для всей функции. Возможно, было бы полезно иметь возможность объявлять параметр функции const
, чтобы вы не могли его переназначить, но я предполагаю, что разработчики не посчитали достаточно полезным вносить это изменение в синтаксис (они уже усложнили его, добавив деструктурирование и значения по умолчанию).).
Комментарии:
1. В отличие от таких языков, как C, переменные и функции в JavaScript не всегда объявляются в момент использования, а вместо этого могут быть подняты на вершину их области во время выполнения. ключевые слова «var» и «let» помогают интерпретатору понять, как управлять доступом к этим переменным. Поскольку параметры функции уже находятся в верхней части их области видимости, они будут обрабатываться одинаково независимо от того, использовался ли «var» или «let», что делает несколько ненужным добавление ключевого слова. Я написал небольшой пост о подъеме здесь для контекста twistedbrackets.com/variable-and-function-hoisting
Ответ №2:
Так работает язык и определяется его синтаксис. Однако для этого должна быть причина.
Я могу немного порассуждать об этом и поделиться своей причиной.
В JavaScript есть два типа области видимости,
- Область действия функции,
- Область действия блока
var
определяет переменную с областью действия функции, тогда let
как и const
определяет переменные области действия блока.
Параметры функции находятся в области видимости функции, что имеет смысл, по крайней мере, с текущим мышлением языка, поскольку не имеет смысла передавать параметр функции, чтобы быть в области видимости в блоке. Это может вызвать вопросы, касающиеся неоднозначности области видимости, к которой принадлежат параметры, которые можно было бы преодолеть, используя другой синтаксис, чтобы, возможно, каким-то образом обозначать параметры и блоки. С другим подходом к проектированию языка это может быть возможно и даже полезно. Однако текущее состояние языка не таково, и это имеет смысл само по себе.
Также исторически существовал только var
. let
и const
появился намного позже, чем var
, следовательно, в языке была только область действия функции, и поэтому параметры должны были находиться либо в глобальной области, либо в области действия функции, и он был разработан, чтобы быть в области действия функции, что не является необычным и очень распространенным в алгол-подобных языках. Когда let
и const
появились, одной из причин их появления было наличие области действия на уровне блоков, отличной от функциональных блоков, таких как if
условия и for
т. Д. Таким образом, они не применялись к параметрам функции, что обычно более полезно, когда все они видны в их функции.
Просто чтобы прояснить, что я имел в виду относительно гипотетической альтернативной области видимости в альтернативном юниверсе или параллельном юниверсе JavaScript, я хочу построить пример с еще одним возникшим вопросом, на который нужно ответить:
function f(x:a, x:b, y:b) { // parameters' scope labeling syntax
scope a: if(x > 1 amp;amp; !y) return x 1; // block's scope labeling syntax
scope b: return x * y;
}
f(3:a, 9:b, 0:b) // returns 4
f(3:a, 9:b, 1:b) // returns 27