Почему мы не используем такие ключевые слова, как «let», «var» и «const» в параметрах функции в javascript?

#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 есть два типа области видимости,

  1. Область действия функции,
  2. Область действия блока

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