From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../reference/operators/function/index.html | 143 +++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 files/ru/web/javascript/reference/operators/function/index.html (limited to 'files/ru/web/javascript/reference/operators/function') diff --git a/files/ru/web/javascript/reference/operators/function/index.html b/files/ru/web/javascript/reference/operators/function/index.html new file mode 100644 index 0000000000..aefe1d0c2b --- /dev/null +++ b/files/ru/web/javascript/reference/operators/function/index.html @@ -0,0 +1,143 @@ +--- +title: Функциональное выражение +slug: Web/JavaScript/Reference/Operators/function +tags: + - JavaScript + - Оператор + - Функция +translation_of: Web/JavaScript/Reference/Operators/function +--- +
{{jsSidebar("Operators")}}
+ +

Ключевое слово function может использоваться для определения функции внутри выражения.

+ +

Вы можете также определять функции используя конструктор {{jsxref("Function")}} и {{jsxref("Statements/function", "объявление функции")}}.

+ +

Синтаксис

+ +
var myFunction = function [name]([param1[, param2[, ..., paramN]]]) {
+   statements
+};
+ +

С версии ES2015 можно также использовать стрелочные функции.

+ +

Параметры

+ +
+
name
+
Имя функции. Может быть опущено, в таком случае функция является анонимной. Имя функции является локальным для её тела.
+
paramN
+
Имя аргумента, передаваемого в функцию.
+
statements
+
Инструкции, составляющие тело функции.
+
+ +

Описание

+ +

Функциональное выражение и объявление функции очень похожи и имеют почти одинаковый синтаксис. Главным отличием между ними является имя функции, которое в случае функциональных выражений может быть опущено для создания анонимных функций. Функциональное выражение может быть использовано для создания самовызывающейся функции {{Glossary("IIFE")}} (Immediately Invoked Function Expression), которая исполняется сразу же после того, как она была определена. Более подробная информация изложена в разделе о функциях.

+ +

Поднятие функциональных выражений

+ +

Функциональные выражения в JavaScript не {{Glossary("поднятие", "поднимаются (hoisting)")}}, в отличие от {{jsxref("Statements/function", "объявленных функций", "#Поднимание_объявленной_функции")}}. Вы не можете использовать функциональные выражения прежде, чем вы их определили.

+ +
console.log(notHoisted) // undefined
+//Хотя объявленная переменная и поднимается, определение переменной происходит позже
+notHoisted(); // TypeError: notHoisted is not a function
+
+var notHoisted = function() {
+   console.log('bar');
+};
+ +

Именованное функциональное выражение

+ +

Если вы хотите сослаться на текущую функцию внутри тела этой функции, вам необходимо создать именованое функциональное выражение. Данное имя будет локальным только для тела функции (её области видимости). Кроме того, это позволяет избежать использования нестандартного свойства {{jsxref("arguments.callee")}}.

+ +
var math = {
+  'factit': function factorial(n) {
+    console.log(n);
+    if (n <= 1) {
+      return 1;
+    }
+    return n * factorial(n - 1);
+  }
+};
+
+math.factit(3) //3;2;1;
+
+ +

Переменная, которой присвоено функциональное выражение, будет иметь свойство name, содержащее имя функции. Оно не изменится при переприсваивании другой переменной. Для анонимной функции, значением свойства name будет имя переменной (неявное имя). Если же имя задано, то будет использовано имя функции (явное имя). Это же касается стрелочных функций (в их случае там будет записано имя переменной, т.к. они всегда анонимные).

+ +
var foo = function() {}
+foo.name // "foo"
+
+var foo2 = foo
+foo2.name // "foo"
+
+var bar = function baz() {}
+bar.name // "baz"
+
+console.log(foo === foo2); // true
+console.log(typeof baz); // undefined
+console.log(bar === baz); // false (errors because baz == undefined)
+ +

Примеры

+ +

Следующий пример демонстрирует создание безымянной (анонимной) функции и присвоение её переменной x. Функция возвращает квадрат переданного значения:

+ +
var x = function (y) {
+   return y * y;
+};
+
+ +

Преимущественно анонимные функции используются как {{Glossary("функция обратного вызова", "функции обратного вызова", 1)}}.

+ +
button.addEventListener('click', function(event) {
+    console.log('button is clicked!')
+});
+ +

Спецификации

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарий
{{SpecName('ESDraft', '#sec-function-definitions', 'Function definitions')}}{{Spec2('ESDraft')}}
{{SpecName('ES6', '#sec-function-definitions', 'Function definitions')}}{{Spec2('ES6')}}
{{SpecName('ES5.1', '#sec-13', 'Function definition')}}{{Spec2('ES5.1')}}
{{SpecName('ES3', '#sec-13', 'Function definition')}}{{Spec2('ES3')}}Изначальное определение. Реализовано в JavaScript 1.5.
+ +

Совместимость с браузерами

+ +

{{Compat("javascript.operators.function")}}

+ +

Смотрите также

+ + -- cgit v1.2.3-54-g00ecf