В) JavaScript имеет область действия. Что это значит?
A) Все переменные, объявленные внутри функции, видны через функцию, в отличие от таких языков, как Java, где переменные, определенные внутри блока кода, такого как блок if или блок else, не видны за пределами блокировать.

В) ES6 вводит область действия блока и устраняет эту проблему. Верно?
А) Да, верно.

Q) Что такое подъем?
A) Подъемотносится к механизму JavaScript, который перемещает все объявления переменных в начало функции и просто выполняет операцию присваивания в том месте, где разработчик написал оператор присваивания при объявлении переменной. Итак, чтобы сохранить согласованность в том, как это будет эффективно, лучше всего объявлять все переменные в функции в верхней части функции.

В) Таким образом, подъем означает перемещение чего-либо наверх, как в случае с «Поднятием флага», а в случае с JavaScript объявления переменных поднимаются наверх функции. Верно?
А) Да.

В) Что такое оператор функции?
А) Оператор функции аналогичен выражению функции с ОБЯЗАТЕЛЬНЫМ ИМЯ.

Q) Оператор Function по сути является оператором присваивания?
A) Да, это оператор присваивания, в котором переменной присваивается функция. Переменная — это имя функции, и именно поэтому это имя является обязательным для оператора функции.

В) Хорошо — значит, у нас есть оператор функции, который является присваиванием, и поэтому они тоже будут подняты?
А) Да.

Q) Есть ли разница в том, как поднимается функция, от того, как поднимается обычная переменная?
A) Да, не только объявление переменной, но и присвоение переменной также поднимается сверху в ES3. Но в более поздних версиях это, похоже, не так, как показано в встречном примере ниже.

› var test = function() {
… var a = 10;
… var b = 20;
… var c = sum(a,b);
… var sum = function( v1 , v2) {
….. return v1 + v2;
….. };
… return c;
… };
undefined< br /> › тест();

TypeError: sum не является функцией
в тесте (repl:4:9)
в repl:1:1
в sigintHandlersWrap (vm.js:22:35)
в at sigintHandlersWrap (vm.js:73:12)
в ContextifyScript.Script.runInThisContext (vm.js:21:12)
в REPLServer.defaultEval (repl.js:340:29)
atbound (domain.js:280:14)
at REPLServer.runBound [as eval] (domain.js:293:12)
at REPLServer.‹anonymous› (repl.js:538:10) )
в emitOne (events.js:101:20)

Этот пример был написан, чтобы продемонстрировать, что функция sum будет видна при вызове sum, даже если функция sum еще не была объявлена ​​из-за того, что JavaScript поднимет функцию наверх, но, похоже, этого не произошло в узел REPL, поскольку он жалуется, что сумма не является функцией.

В) Функциональный оператор и функциональное выражение кажутся очень похожими. Как их отличить?
А) Если первый токен — это ключевое слово функция, то это оператор функции.

В) Какой из них лучше? оператор функции или выражение функции?
A) Выражение функции лучше, поскольку оператор функции подвергается подъемному поведению.

Объявляйте функции перед их использованием, потому что это та последовательность, в которой JS-компилятор увидит их. Кроме того, логично, что вы что-то определяете, а затем используете.

В) Каковы цели оператора return?
1) Оператор return позволяет функции вернуться раньше. Если функция понимает, что по какой-то причине нет смысла пытаться выполнить все операторы в ней, то оператор return позволяет функции вернуться раньше и избежать проблем.
2) Возврат значение. Оператор return — это то, что позволяет функции возвращать вызывающему объекту конкретное значение.

Оператор return имеет две формы: одна содержит выражение, следующее за ключевым словом return, которое возвращается вызывающей стороне, а вторая представляет собой простое ключевое слово return без выражения, следующего за ключевым словом return.

вернуть результат;
вернуть;

Каждая функция возвращает значение, либо указанное, либо, если возвращаемое значение не указано, функция возвращает неопределенное значение.

В) Есть ли исключение из правила, что функция либо возвращает указанное значение, либо не определено?
А) Да, есть. Когда функция вызывается как конструктор, в котором возвращается значение this.

В) Что такое вставка точки с запятой в JavaScript?
А) JavaScript обрабатывает новые строки как точки с запятой и автоматически вставляет точку с запятой в места с новыми строками и без точек с запятой.

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

В. Какие два псевдопараметра может принимать функция?
1) аргументы
2) this.

arguments — это специальный параметр, похожий на массив и содержащий все параметры, которые использовались во время вызова функции.
arguments.length будет содержать количество переданных аргументов, но arguments — это не совсем массив и, следовательно, методы. Например, forEach и т. д. не будут работать с аргументами.

В) Почему плохо возиться с параметром arguments?
1) Если вы измените значение в индексе аргументов, вы можете эффективно изменить соответствующий входной параметр, который никогда не будет тем, что вам нужно.
2) Если вы выполняете объединение массива аргументов и эффективно переупорядочиваете аргументы, то вы помещаете variableThree на позицию два и т. д., что приводит к непредсказуемому и потенциально разрушительному поведению аргументов.

По этой причине лучше всего рассматривать массив arguments как структуру, доступную только для чтения.

В) Могу ли я увидеть краткий пример аргументов в действии?
А) Конечно. Вот.

› var sumNumbers = function() {
… var total = 0;
… for ( var index = 0; index ‹ arguments.length; index++) {
….. total = total + arguments[index];
….. };
… вернуть итог;
… };
undefined
› sumNumbers(1,3,5,7,9 ,11);
36

Обратите внимание, что определение функции вообще не нуждается в каких-либо аргументах.

В. Почему arguments не является массивом, а представляет собой объект, похожий на массив?
A) В arguments нет Array.prototype в цепочке прототипов, что означает, что вы не можете использовать такие методы, как сокращение для аргументов.

var sum = function(){
return arguments.reduce(function(accum,elem){
return accum + elem;
});
};
undefined
sum(1,2,3,4,5);
VM313:2 Uncaught TypeError: arguments.reduce не является функцией

Это верно для версии JavaScript ES3. Предполагается, что в более поздних версиях JavaScript будет добавлена ​​поддержка функциональных методов, таких как filter, forEach,reduce и т. д. Однако я еще не видел, чтобы это имело место в Node REPL или консоли Chrome.