From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../global_objects/function/apply/index.html | 252 +++++++++++++++++ .../global_objects/function/arguments/index.html | 116 ++++++++ .../global_objects/function/arity/index.html | 30 ++ .../global_objects/function/bind/index.html | 311 +++++++++++++++++++++ .../global_objects/function/call/index.html | 175 ++++++++++++ .../global_objects/function/caller/index.html | 131 +++++++++ .../global_objects/function/displayname/index.html | 111 ++++++++ .../reference/global_objects/function/index.html | 200 +++++++++++++ .../global_objects/function/isgenerator/index.html | 83 ++++++ .../global_objects/function/length/index.html | 145 ++++++++++ .../global_objects/function/name/index.html | 219 +++++++++++++++ .../global_objects/function/prototype/index.html | 151 ++++++++++ .../global_objects/function/tosource/index.html | 87 ++++++ .../global_objects/function/tostring/index.html | 110 ++++++++ 14 files changed, 2121 insertions(+) create mode 100644 files/ru/web/javascript/reference/global_objects/function/apply/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/arguments/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/arity/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/bind/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/call/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/caller/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/displayname/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/isgenerator/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/length/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/name/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/prototype/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/tosource/index.html create mode 100644 files/ru/web/javascript/reference/global_objects/function/tostring/index.html (limited to 'files/ru/web/javascript/reference/global_objects/function') diff --git a/files/ru/web/javascript/reference/global_objects/function/apply/index.html b/files/ru/web/javascript/reference/global_objects/function/apply/index.html new file mode 100644 index 0000000000..538c25a654 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/apply/index.html @@ -0,0 +1,252 @@ +--- +title: Function.prototype.apply() +slug: Web/JavaScript/Reference/Global_Objects/Function/apply +tags: + - Function + - JavaScript + - Method + - Reference + - Référence(2) +translation_of: Web/JavaScript/Reference/Global_Objects/Function/apply +--- +
{{JSRef("Global_Objects", "Function")}}
+ +

Общие сведения

+ +

Метод apply() вызывает функцию с указанным значением this и аргументами, предоставленными в виде массива (либо массивоподобного объекта).

+ +
+

Примечание: хотя синтаксис этой функции практически полностью идентичен функции {{jsxref("Function.prototype.call()", "call()")}}, фундаментальное различие между ними заключается в том, что функция call() принимает список аргументов, в то время как функция apply() принимает единичный массив аргументов.

+
+ +

Синтаксис

+ +
fun.apply(thisArg, [argsArray])
+ +

Параметры

+ +
+
thisArg
+
Опциональный параметр. Значение this, предоставляемое для вызова функции fun. Обратите внимание, что this может не быть реальным значением, видимым этим методом: если метод является функцией в {{jsxref("Functions_and_function_scope/Strict_mode", "нестрогом режиме", "", 1)}}, значения {{jsxref("Global_Objects/null", "null")}} и {{jsxref("Global_Objects/undefined", "undefined")}} будут заменены глобальным объектом, а примитивные значения будут упакованы в объекты.
+
argsArray
+
Опциональный параметр. Массивоподобный объект, определяющий аргументы, с которыми функция fun должна быть вызвана, либо {{jsxref("Global_Objects/null", "null")}} или {{jsxref("Global_Objects/undefined", "undefined")}}, если в функцию не надо передавать аргументы. Начиная с ECMAScript 5 эти аргументы могут быть обобщёнными массивоподобными объектами, а не только массивом. Смотрите ниже информацию по {{anch("Browser_compatibility", "совместимости с браузерами")}}.
+
+ +

Описание

+ +

Вы можете присваивать различные объекты this при вызове существующей функции. this ссылается на текущий объект, вызывающий объект. С помощью apply() вы можете написать метод один раз, а затем наследовать его в других объектах без необходимости переписывать метод для каждого нового объекта.

+ +

Метод apply очень похож на метод {{jsxref("Function.prototype.call()", "call()")}}, за исключением поддерживаемого типа аргументов. Вы можете использовать массив аргументов вместо набора именованных параметров. Вместе с apply вы можете использовать литерал массива, например, fun.apply(this, ['есть', 'бананы']), либо объект {{jsxref("Global_Objects/Array", "Array")}}, например, fun.apply(this, new Array('есть', 'бананы')).

+ +

Также вы можете использовать в качестве параметра argsArray псевдомассив {{jsxref("Functions_and_function_scope/arguments", "arguments")}}. arguments является локальной переменной функции. Он может использоваться для всех неопределённых аргументов вызываемого объекта. Таким образом, вы не обязаны знать, сколько и какие аргументы требует вызываемый объект при использовании метода apply(). Вы можете использовать псевдомассив arguments для передачи всех аргументов в вызываемый объект. Вызываемый объект самостоятельно разберётся с обработкой аргументов.

+ +

Начиная с 5-го издания ECMAScript, вы также можете использовать любой вид массивоподобного объекта, что на практике означает, что он должен иметь свойство length и целочисленные свойства в диапазоне (0...length). В качестве примера, теперь вы можете использовать {{domxref("NodeList")}} или свой собственный объект вида { 'length': 2, '0': 'есть', '1': 'бананы' }.

+ +

{{note("Большинство браузеров, включая Chrome 14 и Internet Explorer 9, всё ещё не принимают массивоподобные объекты и будут выбрасывать исключение.")}}

+ +

Примеры

+ +

Пример: использование apply() для связи конструкторов объекта в цепочку

+ +

Вы можете использовать метод apply() для объединения в цепочку {{jsxref("Operators/new", "конструкторов", "", 1)}} объекта, как в Java. В следующем примере мы создадим в объекте {{jsxref("Global_Objects/Function", "Function")}} глобальный метод construct(), который позволит нам использовать массивоподобные объекты с конструктором вместо списка аргументов.

+ +
Function.prototype.construct = function (aArgs) {
+  var oNew = Object.create(this.prototype);
+  this.apply(oNew, aArgs);
+  return oNew;
+};
+
+ +
+

Примечание: метод {{jsxref("Object.create()")}}, использованный в этом примере, относительно новый. В качестве альтернативного способа можно рассмотреть возможность использования замыкания:

+ +
Function.prototype.construct = function(aArgs) {
+  var fConstructor = this, fNewConstr = function() { fConstructor.apply(this, aArgs); };
+  fNewConstr.prototype = fConstructor.prototype;
+  return new fNewConstr();
+};
+
+
+ +

Пример использования:

+ +
function MyConstructor() {
+  for (var nProp = 0; nProp < arguments.length; nProp++) {
+    this['property' + nProp] = arguments[nProp];
+  }
+}
+
+var myArray = [4, 'Привет, мир!', false];
+var myInstance = MyConstructor.construct(myArray);
+
+alert(myInstance.property1);                // выведет 'Привет, мир!'
+alert(myInstance instanceof MyConstructor); // выведет 'true'
+alert(myInstance.constructor);              // выведет 'MyConstructor'
+
+ +
+

Примечание: этот неродной метод Function.construct() не будет работать с некоторыми родными конструкторами (вроде конструктора {{jsxref("Global_Objects/Date", "Date")}}, к примеру). В этих случаях вы можете использовать метод {{jsxref("Function.prototype.bind()")}} (например, представьте, что вы имеете следующий массив, который можно использовать с конструктором {{jsxref("Global_Objects/Date", "Date")}}: [2012, 11, 4]; в этом случае вы напишите что-то вроде: new (Function.prototype.bind.apply(Date, [null].concat([2012, 11, 4])))() — так или иначе, это не самый изящный способ и, вероятно, его не стоит использовать в рабочем окружении).

+
+ +

Пример: использование apply() и встроенных функций

+ +

Умное использование метода apply() позволяет вам использовать встроенные функции для некоторых задач, для которых в противном случае пришлось бы писать цикл по массиву значений. В качестве примера давайте используем {{jsxref("Math.max()")}}/{{jsxref("Math.min()")}} для нахождения максимального/минимального значения в массиве.

+ +
/* мин/макс числа в массиве */
+var numbers = [5, 6, 2, 3, 7];
+
+/* используем apply к Math.min/Math.max */
+var max = Math.max.apply(null, numbers); /* Это эквивалентно Math.max(numbers[0], ...)
+                                            или Math.max(5, 6, ...) */
+var min = Math.min.apply(null, numbers);
+
+/* сравним с простым алгоритмом с циклом */
+max = -Infinity, min = +Infinity;
+
+for (var i = 0; i < numbers.length; i++) {
+  if (numbers[i] > max) {
+    max = numbers[i];
+  }
+  if (numbers[i] < min) {
+    min = numbers[i];
+  }
+}
+
+ +

Но будьте осторожны: при использовании метода apply() таким образом вы рискуете выйти за пределы ограничения на количество аргументов в движке JavaScript. Последствия применения функции с очень большим количеством аргументов (думается, больше десяти тысяч аргументов) различаются от движка к движку (JavaScriptCore имеет жёстко зашитое ограничение на количество аргументов в 65536), поскольку этот предел (на самом деле, это природа поведения любого чрезвычайно огромного стека) не определён. Некоторые движки будут выкидывать исключение. Хуже того, другие просто отбрасывают реально переданные функции аргументы сверх лимита. (Для иллюстрации последнего случая: если такой движок имеет ограничение в четыре элемента [реальное ограничение, конечно же, гораздо выше], это выглядело бы так, как если бы в примере выше в метод apply() были переданы аргументы 5, 6, 2, 3, а не весь массив.) Если ваш масив значений может вырасти до десятков тысяч, используйте смешанный подход: применяйте вашу функцию к порциям массива:

+ +
function minOfArray(arr) {
+  var min = Infinity;
+  var QUANTUM = 32768;
+
+  for (var i = 0, len = arr.length; i < len; i += QUANTUM) {
+    var submin = Math.min.apply(null, arr.slice(i, Math.min(i + QUANTUM, len)));
+    min = Math.min(submin, min);
+  }
+
+  return min;
+}
+
+var min = minOfArray([5, 6, 2, 3, 7]);
+
+ +

Пример: использование apply() в «monkey-патчинге»

+ +

Метод apply() может быть лучшим вариантом для «monkey-патчинга» встроенных в Firefox функций, либо JS библиотек. Пусть у вас есть функция someobject.foo(), вы можете изменить её таким немного хакерским способом:

+ +
var originalfoo = someobject.foo;
+someobject.foo = function() {
+  // Делаем что-то до вызова функции
+  console.log(arguments);
+  // Вызываем функцию так, как будто бы она была вызвана обычным образом:
+  originalfoo.apply(this, arguments);
+  // Делаем что-то после вызова функции.
+}
+
+ +

Этот метод особенно удобен, когда вам нужно отладить события, либо интерфейс с чем-то, что не имеет API, вроде различных событий .on([event]..., например, тех что используются в Инспекторе инструментов разработчика).

+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарии
ECMAScript 3-е издание.СтандартИзначальное определение. Реализована в JavaScript 1.3.
{{SpecName('ES5.1', '#sec-15.3.4.3', 'Function.prototype.apply')}}{{Spec2('ES5.1')}}
{{SpecName('ES6', '#sec-function.prototype.apply', 'Function.prototype.apply')}}{{Spec2('ES6')}}
+ +

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

+ +
{{CompatibilityTable}}
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
Обобщённые массивоподобные объекты ES 5.1, вроде {{jsxref("Functions_and_function_scope/arguments", "arguments")}}{{CompatUnknown}}{{CompatGeckoDesktop("2.0")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
Обобщённые массивоподобные объекты ES 5.1, вроде {{jsxref("Functions_and_function_scope/arguments", "arguments")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatGeckoMobile("2.0")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+ +

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

+ + diff --git a/files/ru/web/javascript/reference/global_objects/function/arguments/index.html b/files/ru/web/javascript/reference/global_objects/function/arguments/index.html new file mode 100644 index 0000000000..7b089887c4 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/arguments/index.html @@ -0,0 +1,116 @@ +--- +title: Function.arguments +slug: Web/JavaScript/Reference/Global_Objects/Function/arguments +tags: + - Deprecated + - Function + - JavaScript + - Property + - arguments +translation_of: Web/JavaScript/Reference/Global_Objects/Function/arguments +--- +
+ {{JSRef("Global_Objects", "Function")}} {{deprecated_header}}
+

Сводка

+

Свойство function.arguments ссылалось на массивоподобный объект, соответствующий аргументам, переданным в функцию. Используйте вместо него простую переменную {{jsxref("Functions_and_function_scope/arguments", "arguments")}}.

+

Описание

+

Синтаксис function.arguments устарел. Рекомендуемым способом доступа к объекту {{jsxref("Functions_and_function_scope/arguments", "arguments")}}, доступному внутри функций, являеся простая ссылка на переменную {{jsxref("Functions_and_function_scope/arguments", "arguments")}}.

+

В случае рекурсии, то есть, если функция f несколько раз появляется в стеке вызовов, значение f.arguments представляет аргументы, соответствующие самому последнему вызову функции.

+

Примеры

+
function f(n) { g(n - 1); }
+
+function g(n) {
+  console.log('до: ' + g.arguments[0]);
+  if (n > 0) { f(n); }
+  console.log('после: ' + g.arguments[0]);
+}
+
+f(2);
+
+
+// Вывод
+
+// до: 1
+// до: 0
+// после: 0
+// после: 1
+
+

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

+ + + + + + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарии
ECMAScript 1-е издание.СтандартИзначальное определение. Реализована в JavaScript 1.0. Устарело в связи с объектом {{jsxref("Functions_and_function_scope/arguments", "arguments")}}
{{SpecName('ES5.1', '#sec-10.6', 'объект arguments')}}{{Spec2('ES5.1')}}Объект {{jsxref("Functions_and_function_scope/arguments", "arguments")}}
{{SpecName('ES6', '#sec-arguments-object', 'объект arguments')}}{{Spec2('ES6')}}Объект {{jsxref("Functions_and_function_scope/arguments", "arguments")}}
+

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

+
+ {{CompatibilityTable}}
+
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+

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

+ diff --git a/files/ru/web/javascript/reference/global_objects/function/arity/index.html b/files/ru/web/javascript/reference/global_objects/function/arity/index.html new file mode 100644 index 0000000000..8bcd00363b --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/arity/index.html @@ -0,0 +1,30 @@ +--- +title: Function.arity +slug: Web/JavaScript/Reference/Global_Objects/Function/arity +tags: + - Function + - JavaScript + - Obsolete + - Property + - Unimplemented +translation_of: Archive/Web/JavaScript/Function.arity +--- +
{{JSRef}}{{Obsolete_Header}}
+ +

Свойство arity использовалось для возврата количества ожидаемых функцией аргументов, однако, оно больше не существует и было заменено свойством {{JSxRef("Function.prototype.length")}}.

+ +

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

+ +

Реализовано в JavaScript 1.2. Устарело в JavaScript 1.4.

+ +

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

+ + + +

{{Compat("javascript.builtins.Function.arity")}}

+ +

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

+ + diff --git a/files/ru/web/javascript/reference/global_objects/function/bind/index.html b/files/ru/web/javascript/reference/global_objects/function/bind/index.html new file mode 100644 index 0000000000..325c24fa0b --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/bind/index.html @@ -0,0 +1,311 @@ +--- +title: Function.prototype.bind() +slug: Web/JavaScript/Reference/Global_Objects/Function/bind +tags: + - ECMAScript5 + - ECMAScript6 + - Function + - JavaScript + - Method + - Reference + - polyfill +translation_of: Web/JavaScript/Reference/Global_Objects/Function/bind +--- +
{{JSRef("Global_Objects", "Function")}}
+ +

Сводка

+ +

Метод bind() создаёт новую функцию, которая при вызове устанавливает в качестве контекста выполнения this предоставленное значение. В метод также передаётся набор аргументов, которые будут установлены перед переданными в привязанную функцию аргументами при её вызове.

+ +

Синтаксис

+ +
fun.bind(thisArg[, arg1[, arg2[, ...]]])
+ +

Параметры

+ +
+
thisArg
+
Значение, передаваемое в качестве this в целевую функцию при вызове привязанной функции. Значение игнорируется, если привязанная функция конструируется с помощью оператора {{jsxref("Operators/new", "new")}}.
+
arg1, arg2, ...
+
Аргументы целевой функции, передаваемые перед аргументами привязанной функции при вызове целевой функции.
+
+ +

Описание

+ +

Метод bind() создаёт новую "привязанную функцию" (ПФ).  ПФ - это "необычный функциональный объект" ( термин из ECMAScript 6 ), который является оберткой над исходным функциональным объектом. Вызов ПФ   приводит к исполнению кода обернутой функции.

+ +

ПФ имеет следующие внутренние ( скрытые ) свойства:

+ + + +

Когда ПФ вызывается, исполняется ее внутренний метод [[Call]] со следующими аргументами Call(target, boundThis, args).

+ + + +

Привязанная функция также может быть сконструирована с помощью оператора {{jsxref("Operators/new", "new")}}: это работает так, как если бы вместо неё конструировалась целевая функция. Предоставляемое значение this в этом случае игнорируется, хотя ведущие аргументы всё ещё передаются в эмулируемую функцию.

+ +

Примеры

+ +

Пример: создание привязанной функции

+ +

Простейшим способом использования bind() является создание функции, которая, вне зависимости от способа её вызова, вызывается с определённым значением this. Обычным заблуждением для новичков в JavaScript является извлечение метода из объекта с целью его дальнейшего вызова в качестве функции и ожидание того, что он будет использовать оригинальный объект в качестве своего значения this (например, такое может случиться при использовании метода как функции обратного вызова). Однако, без специальной обработки, оригинальный объект зачастую теряется. Создание привязанной функции из функции, использующей оригинальный объект, изящно решает эту проблему:

+ +
this.x = 9;
+var module = {
+  x: 81,
+  getX: function() { return this.x; }
+};
+
+module.getX(); // 81
+
+var getX = module.getX;
+getX(); // 9, поскольку в этом случае this ссылается на глобальный объект
+
+// создаём новую функцию с this, привязанным к module
+var boundGetX = getX.bind(module);
+boundGetX(); // 81
+
+ +

Пример: частичные функции

+ +

Следующим простейшим способом использования bind() является создание функции с предопределёнными аргументами. Эти аргументы (если они есть) передаются после значения this и вставляются перед аргументами, передаваемыми в целевую функцию при вызове привязанной функции.

+ +
function list() {
+  return Array.prototype.slice.call(arguments);
+}
+
+var list1 = list(1, 2, 3); // [1, 2, 3]
+
+// Создаём функцию с предустановленным ведущим аргументом
+var leadingThirtysevenList = list.bind(undefined, 37);
+
+var list2 = leadingThirtysevenList(); // [37]
+var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]
+
+ +

Пример: с setTimeout

+ +

По умолчанию, внутри {{domxref("window.setTimeout()")}} контекст this устанавливается в объект {{domxref("window")}} (или global). При работе с методами класса, требующими this для ссылки на экземпляры класса, вы можете явно привязать this к функции обратного вызова для сохранения экземпляра.

+ +
function LateBloomer() {
+  this.petalCount = Math.ceil(Math.random() * 12) + 1;
+}
+
+// Объявляем цветение с задержкой в 1 секунду
+LateBloomer.prototype.bloom = function() {
+  window.setTimeout(this.declare.bind(this), 1000);
+};
+
+LateBloomer.prototype.declare = function() {
+  console.log('Я прекрасный цветок с ' +
+    this.petalCount + ' лепестками!');
+};
+
+ +

Пример: привязывание функций, используемых в качестве конструкторов

+ +
+

Предупреждение: этот раздел демонстрирует возможности JavaScript и документирует некоторые граничные случаи использования метода bind(). Показанные ниже методы не являются лучшей практикой и, вероятно, их не следует использовать в рабочем окружении.

+
+ +

Привязанные функции автоматически подходят для использования вместе с оператором {{jsxref("Operators/new", "new")}} для конструирования новых экземпляров, создаваемых целевой функцией. Когда привязанная функция используется для конструирования значения, предоставляемое значение this игнорируется. Однако, предоставляемые аргументы всё так же вставляются перед аргументами конструктора:

+ +
function Point(x, y) {
+  this.x = x;
+  this.y = y;
+}
+
+Point.prototype.toString = function() {
+  return this.x + ',' + this.y;
+};
+
+var p = new Point(1, 2);
+p.toString(); // '1,2'
+
+
+var emptyObj = {};
+var YAxisPoint = Point.bind(emptyObj, 0/*x*/);
+// не поддерживается полифиллом, приведённым ниже,
+// но отлично работает с родным bind:
+var YAxisPoint = Point.bind(null, 0/*x*/);
+
+var axisPoint = new YAxisPoint(5);
+axisPoint.toString(); // '0,5'
+
+axisPoint instanceof Point; // true
+axisPoint instanceof YAxisPoint; // true
+new Point(17, 42) instanceof YAxisPoint; // true
+
+ +

Обратите внимание, что вам не нужно делать ничего особенного для создания привязанной функции, используемой с оператором {{jsxref("Operators/new", "new")}}. В итоге, для создания явно вызываемой привязанной функции, вам тоже не нужно делать ничего особенного, даже если вам требуется, чтобы привязанная функция вызывалась только с помощью оператора {{jsxref("Operators/new", "new")}}.

+ +
// Пример может быть запущен прямо в вашей консоли JavaScript
+// ...продолжение примера выше
+
+// Всё ещё можно вызывать как нормальную функцию
+// (хотя обычно это не предполагается)
+YAxisPoint(13);
+
+emptyObj.x + ',' + emptyObj.y;
+// >  '0,13'
+
+ +

Если вы хотите поддерживать использование привязанной функции только с помощью оператора {{jsxref("Operators/new", "new")}}, либо только с помощью прямого вызова, целевая функция должна предусматривать такие ограничения.

+ +

Пример: создание сокращений

+ +

Метод bind() также полезен в случаях, если вы хотите создать сокращение для функции, требующей определёное значение this.

+ +

Возьмём, например, метод {{jsxref("Array.prototype.slice")}}, который вы можете использовать для преобразования массивоподобного объекта в настоящий массив. Вы можете создать подобное сокращение:

+ +
var slice = Array.prototype.slice;
+
+// ...
+
+slice.call(arguments);
+
+ +

С помощью метода bind(), это сокращение может быть упрощено. В следующем куске кода slice является функцией, привязанной к функции {{jsxref("Function.prototype.call()", "call()")}} объекта {{jsxref("Function.prototype")}}, со значением this, установленным в функцию {{jsxref("Array.prototype.slice()", "slice()")}} объекта {{jsxref("Array.prototype")}}. Это означает, что дополнительный вызов call() может быть устранён:

+ +
// Тоже самое, что и slice в предыдущем примере
+var unboundSlice = Array.prototype.slice;
+var slice = Function.prototype.call.bind(unboundSlice);
+
+// ...
+
+slice(arguments);
+
+ +

Полифилл

+ +

Функция bind является дополнением к стандарту ECMA-262 5-го издания; поэтому она может присутствовать не во всех браузерах. Вы можете частично обойти это ограничение, вставив следующий код в начало ваших скриптов, он позволяет использовать большую часть возможностей bind() в реализациях, не имеющих его родной поддержки.

+ +
if (!Function.prototype.bind) {
+  Function.prototype.bind = function(oThis) {
+    if (typeof this !== 'function') {
+      // ближайший аналог внутренней функции
+      // IsCallable в ECMAScript 5
+      throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
+    }
+
+    var aArgs = Array.prototype.slice.call(arguments, 1),
+        fToBind = this,
+        fNOP    = function() {},
+        fBound  = function() {
+          return fToBind.apply(this instanceof fNOP && oThis
+                 ? this
+                 : oThis,
+                 aArgs.concat(Array.prototype.slice.call(arguments)));
+        };
+
+    fNOP.prototype = this.prototype;
+    fBound.prototype = new fNOP();
+
+    return fBound;
+  };
+}
+
+ +

Некоторые из многих отличий (так же могут быть и другие, данный список далеко не исчерпывающий) между этой реализацией и реализацией по умолчанию:

+ + + +

Если вы решили использовать частичную реализацию, не рассчитывайте на корректную работу в тех случаях, когда реализация отклоняется от спецификации ECMA-262 5-го издания! Однако, в определённых случаях (и, возможно, с дополнительными модификациями для отдельных нужд), применение данной частичной реализации может быть вполне оправданным до тех пор, пока bind() не станет широко реализован в соответствии со спецификацией.

+ +

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

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

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

+ +
{{CompatibilityTable}}
+ +
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatChrome("7")}}{{CompatGeckoDesktop("2")}}{{CompatIE("9")}}{{CompatOpera("11.60")}}{{CompatSafari("5.1.4")}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatAndroid("4.0")}}{{CompatChrome("0.16")}}{{CompatGeckoMobile("2")}}{{CompatUnknown}}{{CompatOperaMobile("11.50")}}{{CompatSafari("6.0")}}
+
+ +

На основе таблицы совместимости Kangax.

+ +

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

+ + diff --git a/files/ru/web/javascript/reference/global_objects/function/call/index.html b/files/ru/web/javascript/reference/global_objects/function/call/index.html new file mode 100644 index 0000000000..500c4af182 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/call/index.html @@ -0,0 +1,175 @@ +--- +title: Function.prototype.call() +slug: Web/JavaScript/Reference/Global_Objects/Function/call +tags: + - Function + - JavaScript + - Method +translation_of: Web/JavaScript/Reference/Global_Objects/Function/call +--- +
{{JSRef("Global_Objects", "Function")}}
+ +

Сводка

+ +

Метод call() вызывает функцию с указанным значением this и индивидуально предоставленными аргументами.

+ +
+

Примечание: хотя синтаксис этой функции практически полностью идентичен функции {{jsxref("Function.prototype.apply", "apply()")}}, фундаментальное различие между ними заключается в том, что функция call() принимает список аргументов, в то время, как функция apply() - одиночный массив аргументов.

+
+ +

Синтаксис

+ +
fun.call(thisArg[, arg1[, arg2[, ...]]])
+ +

Параметры

+ +
+
thisArg
+
Значение this, предоставляемое для вызова функции fun. Обратите внимание, что this может не быть реальным значением, видимым этим методом: если метод является функцией в {{jsxref("Functions_and_function_scope/Strict_mode", "нестрогом режиме", "", 1)}}, значения {{jsxref("Global_Objects/null", "null")}} и {{jsxref("Global_Objects/undefined", "undefined")}} будут заменены глобальным объектом, а примитивные значения будут упакованы в объекты.
+
arg1, arg2, ...
+
Аргументы для объекта.
+
+ +

Описание

+ +

Вы можете присваивать различные объекты this при вызове существующей функции. this ссылается на текущий объект, вызвавший объект. С помощью call вы можете написать метод один раз, а затем наследовать его в других объектах, без необходимости переписывать метод для каждого нового объекта.

+ +

Примеры

+ +

Пример: использование call для связи конструкторов объекта в цепочку

+ +

Вы можете использовать метод call для объединения в цепочку {{jsxref("Operators/new", "конструкторов", "", 1)}} объекта, как в Java. В следующем примере для объекта продукта Product объявлен конструктор с двумя параметрами, названием name и ценой price. Продукт инициализирует свойства name и price, а специализированные функции определяют ещё категорию category.

+ +
function Product(name, price) {
+  this.name = name;
+  this.price = price;
+
+  if (price < 0) {
+    throw RangeError('Нельзя создать продукт ' +
+                      this.name + ' с отрицательной ценой');
+  }
+}
+
+function Food(name, price) {
+  Product.call(this, name, price);
+  this.category = 'еда';
+}
+
+Food.prototype = Object.create(Product.prototype);
+
+function Toy(name, price) {
+  Product.call(this, name, price);
+  this.category = 'игрушка';
+}
+
+Toy.prototype = Object.create(Product.prototype);
+
+var cheese = new Food('фета', 5);
+var fun = new Toy('робот', 40);
+
+ +

Пример: использование call для вызова анонимной функции

+ +

В этом чисто искусственном примере, мы создаём анонимную функцию и используем call для вызова её на каждом элементе массива. Главная задача анонимной функции здесь — добавить функцию печати в каждый объект, способную напечатать правильный индекс объекта в массиве. Передача объекта в качестве значения this не является острой необходимостью, но мы делаем это в целях объяснения.

+ +
var animals = [
+  { species: 'Лев', name: 'Король' },
+  { species: 'Кит', name: 'Фэйл' }
+];
+
+for (var i = 0; i < animals.length; i++) {
+  (function(i) {
+    this.print = function() {
+      console.log('#' + i + ' ' + this.species
+                  + ': ' + this.name);
+    }
+    this.print();
+  }).call(animals[i], i);
+}
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарии
ECMAScript 3-е издание.СтандартИзначальное определение. Реализована в JavaScript 1.3.
{{SpecName('ES5.1', '#sec-15.3.4.4', 'Function.prototype.call')}}{{Spec2('ES5.1')}}
{{SpecName('ES6', '#sec-function.prototype.call', 'Function.prototype.call')}}{{Spec2('ES6')}}
+ +

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

+ +
{{CompatibilityTable}}
+ +
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +

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

+ + diff --git a/files/ru/web/javascript/reference/global_objects/function/caller/index.html b/files/ru/web/javascript/reference/global_objects/function/caller/index.html new file mode 100644 index 0000000000..4055eaf092 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/caller/index.html @@ -0,0 +1,131 @@ +--- +title: Function.caller +slug: Web/JavaScript/Reference/Global_Objects/Function/caller +tags: + - Function + - JavaScript + - Non-standard + - Property +translation_of: Web/JavaScript/Reference/Global_Objects/Function/caller +--- +
{{JSRef("Global_Objects", "Function")}} {{non-standard_header}}
+ +

Сводка

+ +

Свойство function.caller возвращает функцию, которая вызвала указанную функцию.

+ +

Описание

+ +

Если функция f была вызвана из кода самого верхнего уровня, значение f.caller будет равно {{jsxref("Global_Objects/null", "null")}}, в противном случае значение будет равно функции, вызвавшей f.

+ +

Это свойство пришло на замену удалённого свойства {{jsxref("Functions_and_function_scope/arguments/caller", "arguments.caller")}} объекта {{jsxref("Functions_and_function_scope/arguments", "arguments")}}.

+ +

Специальное свойство __caller__, возвращающее объект активации вызывающей функции и, таким образом, позволяющее восстанавливать стек вызовов, было удалено по соображениям безопасности.

+ +

Примечания

+ +

Обратите внимание, что в случае рекурсии, вы не сможете воссоздать стек вызовов, используя это свойство. Пусть у нас есть функции:

+ +
function f(n) { g(n - 1); }
+function g(n) { if (n > 0) { f(n); } else { stop(); } }
+f(2);
+
+ +

В момент вызова функции stop(), стек вызовов имеет следующий вид:

+ +
f(2) -> g(2) -> f(2) -> g(1) -> f(1) -> g(0) -> stop()
+
+ +

Следующее условие верно:

+ +
stop.caller === g && f.caller === g && g.caller === f
+
+ +

так что если вы попытаетесь оттрассировать стек в функции stop() подобным образом:

+ +
var f = stop;
+var stack = 'Трассировка стека:';
+while (f) {
+  stack += '\n' + f.name;
+  f = f.caller;
+}
+
+ +

то этот цикл никогда не остановится.

+ +

Примеры

+ +

Пример: проверка значения свойства caller функции

+ +

Следующий код проверяет значение свойства caller функции.

+ +
function myFunc() {
+  if (myFunc.caller == null) {
+    return 'Эта функция была вызвана из верхнего уровня!';
+  } else {
+    return 'Эта функция была вызвана из ' + myFunc.caller;
+  }
+}
+
+ +

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

+ +

Не является частью какой-либо спецификации. Реализована в JavaScript 1.5.

+ +

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

+ +
{{CompatibilityTable}}
+ +
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatGeckoDesktop("1.0")}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatGeckoMobile("1.0")}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +

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

+ + diff --git a/files/ru/web/javascript/reference/global_objects/function/displayname/index.html b/files/ru/web/javascript/reference/global_objects/function/displayname/index.html new file mode 100644 index 0000000000..11bae88221 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/displayname/index.html @@ -0,0 +1,111 @@ +--- +title: Function.displayName +slug: Web/JavaScript/Reference/Global_Objects/Function/displayName +tags: + - Function + - JavaScript + - Non-standard + - Property +translation_of: Web/JavaScript/Reference/Global_Objects/Function/displayName +--- +
+ {{JSRef("Global_Objects", "Function")}} {{Non-standard_header}}
+

Сводка

+

Свойство function.displayName возвращает отображаемое имя функции.

+

Описание

+

Если оно определено, свойство displayName возвращает отображаемое имя функции:

+
function doSomething() {}
+
+alert(doSomething.displayName); // "undefined"
+
+var popup = function(content) { alert(content); };
+
+popup.displayName = 'Показать всплывающее окно';
+
+alert(popup.displayName); // "Показать всплывающее окно"
+
+

Вы можете определить функцию с отображаемым именем в {{jsxref("Functions_and_function_scope", "выражении функции", "", 1)}}:

+
var object = {
+  someMethod: function() {}
+};
+
+object.someMethod.displayName = 'someMethod';
+
+alert(object.someMethod.displayName); // выведет "someMethod"
+
+try { someMethod } catch(e) { alert(e); }
+// ReferenceError: someMethod is not defined
+
+

Вы можете динамически изменять свойство displayName функции:

+
var object = {
+  // анонимная функция
+  someMethod: function(value) {
+    this.displayName = 'someMethod (' + value + ')';
+  }
+};
+
+alert(object.someMethod.displayName); // "undefined"
+
+object.someMethod('123')
+alert(object.someMethod.displayName); // "someMethod (123)"
+
+

Примеры

+

Обычно оно используется консолью и профилировщиком, как обёртка над {{jsxref("Function.name", "func.name")}} для отображения имени функции.

+

Введя следующий пример в консоль, вы должны увидеть что-то вроде "function Моя функция()":

+
var a = function() {};
+a.displayName = 'Моя функция';
+
+a
+
+

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

+

Не является частью какой-либо спецификации.

+

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

+
+ {{CompatibilityTable}}
+
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatUnknown}}{{CompatGeckoDesktop(13)}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+

 

diff --git a/files/ru/web/javascript/reference/global_objects/function/index.html b/files/ru/web/javascript/reference/global_objects/function/index.html new file mode 100644 index 0000000000..63d7e776c0 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/index.html @@ -0,0 +1,200 @@ +--- +title: Function +slug: Web/JavaScript/Reference/Global_Objects/Function +tags: + - JavaScript + - Конструктор + - Функция +translation_of: Web/JavaScript/Reference/Global_Objects/Function +--- +
{{JSRef("Global_Objects", "Function")}}
+ +

{{JSRef}}

+ +

Function constructor создает новый объект Function. Вызов constructor создает функцию динамически, но страдает от проблем безопасности и аналогичных (но гораздо менее значительных) проблем производительности {{jsxref("eval")}}. Однако, в отличие от eval, конструктор функций создает функции, которые выполняются только в глобальной области..

+ +

{{EmbedInteractiveExample("pages/js/function-constructor.html")}}

+ + + +

Каждая функция JavaScript на самом деле является объектом функции. Это можно увидеть с помощью кода (function(){}).constructor === Function которая возвращает true.

+ +

Синтаксис

+ +
new Function([arg1[, arg2[, ...argN]],] functionBody)
+ +

Параметры

+ +
+
arg1, arg2, ... argN
+
Имена, используемые функцией в качестве имён формальных аргументов. Каждое имя должно быть строкой, представляющий допустимый идентификатор JavaScript, либо списком таких строк, разделённых запятой; например "x", "theValue" или "a,b".
+
functionBody
+
Строка, содержащая инструкции JavaScript, составляющие определение функции.
+
+ +

Описание

+ +

Объекты Function, созданные констуктором Function, разбираются при создании функции. Это менее эффективно определения функции при помощи выражения function или инструкции function и вызова её внутри вашего кода, поскольку такие функции разбираются вместе с остальным кодом.

+ +

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

+ +
+

Примечание: функции, созданные конструктором Function, не создают замыканий на их контексты создания; они всегда создаются в глобальной области видимости. При их вызове, они получат доступ только к своим локальным переменным и переменным из глобальной области видимости, но не к переменным в той области видимости, в которой вызывался конструктор Function. Это поведение отличается от поведения при использовании функции {{jsxref("Global_Objects/eval", "eval")}} с кодом создания функции.

+
+ +

Вызов констуктора Function как функции (без использования оператора new) имеет тот же самый эффект, что и вызов его как констуктора.

+ +

Свойства и методы объекта Function

+ +

Глобальный объект Function не имеет собственных методов или свойств, однако, поскольку он сам является функцией, он наследует некоторые методы и свойства через цепочку прототипов объекта {{jsxref("Function.prototype")}}.

+ +

Прототип объекта Function

+ +

Свойства

+ +
{{page('/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype', 'Properties')}}
+ +

Методы

+ +
{{page('/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype', 'Methods')}}
+ +

Экземпляры объекта Function

+ +

Экземпляры объекта Function наследуют методы и свойства из объекта {{jsxref("Function.prototype")}}. Как и со всеми другими конструкторами, вы можете изменить объект прототипа констуктора для применения изменений ко всем экземплярам объекта Function.

+ +

Примеры

+ +

Пример: указание аргументов в конструкторе Function

+ +

Следующий код создаёт объект Function, который принимает два аргумента.

+ +
// Пример может быть запущен непосредственно в вашей консоли JavaScript
+
+// Создаём функцию, принимающую два аргумента, и возвращающую их сумму
+var adder = new Function('a', 'b', 'return a + b');
+
+// Вызываем функцию
+adder(2, 6);
+// > 8
+
+ +

Аргуметы "a" и "b" являются именами формальных аргументов, которые используются в теле функции, "return a + b".

+ +

Пример: рекурсивное сокращение для массового изменения DOM

+ +

Создание функции через конструктор Function - это один из способов динамического создания из функции неизвестного количества новых объектов с некоторым выполняемым кодом в глобальной области видимости. Следующий пример (a рекурсивное сокращение для массового изменения DOM) был бы невозможен без вызова конструктора Function для каждого нового запроса, если вы хотите избежать использования замыканий.

+ +
<!doctype html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>Пример MDN - рекурсивное сокращение для массового изменения DOM</title>
+<script type="text/javascript">
+var domQuery = (function() {
+  var aDOMFunc = [
+    Element.prototype.removeAttribute,
+    Element.prototype.setAttribute,
+    CSSStyleDeclaration.prototype.removeProperty,
+    CSSStyleDeclaration.prototype.setProperty
+  ];
+
+  function setSomething(bStyle, sProp, sVal) {
+    var bSet = Boolean(sVal), fAction = aDOMFunc[bSet | bStyle << 1],
+        aArgs = Array.prototype.slice.call(arguments, 1, bSet ? 3 : 2),
+        aNodeList = bStyle ? this.cssNodes : this.nodes;
+
+    if (bSet && bStyle) { aArgs.push(''); }
+    for (
+      var nItem = 0, nLen = this.nodes.length;
+      nItem < nLen;
+      fAction.apply(aNodeList[nItem++], aArgs)
+    );
+    this.follow = setSomething.caller;
+    return this;
+  }
+
+  function setStyles(sProp, sVal) { return setSomething.call(this, true, sProp, sVal); }
+  function setAttribs(sProp, sVal) { return setSomething.call(this, false, sProp, sVal); }
+  function getSelectors() { return this.selectors; };
+  function getNodes() { return this.nodes; };
+
+  return (function(sSelectors) {
+    var oQuery = new Function('return arguments.callee.follow.apply(arguments.callee, arguments);');
+    oQuery.selectors = sSelectors;
+    oQuery.nodes = document.querySelectorAll(sSelectors);
+    oQuery.cssNodes = Array.prototype.map.call(oQuery.nodes, function(oInlineCSS) { return oInlineCSS.style; });
+    oQuery.attributes = setAttribs;
+    oQuery.inlineStyle = setStyles;
+    oQuery.follow = getNodes;
+    oQuery.toString = getSelectors;
+    oQuery.valueOf = getNodes;
+    return oQuery;
+  });
+})();
+</script>
+</head>
+
+<body>
+
+<div class="testClass">Lorem ipsum</div>
+<p>Некоторый текст</p>
+<div class="testClass">dolor sit amet</div>
+
+<script type="text/javascript">
+domQuery('.testClass')
+  .attributes('lang', 'en')('title', 'Risus abundat in ore stultorum')
+  .inlineStyle('background-color', 'black')('color', 'white')('width', '100px')('height', '50px');
+</script>
+</body>
+
+</html>
+
+ +

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

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

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

+ + + +

{{Compat("javascript.builtins.Function")}}

+ +

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

+ + diff --git a/files/ru/web/javascript/reference/global_objects/function/isgenerator/index.html b/files/ru/web/javascript/reference/global_objects/function/isgenerator/index.html new file mode 100644 index 0000000000..e3a972e9e2 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/isgenerator/index.html @@ -0,0 +1,83 @@ +--- +title: Function.prototype.isGenerator() +slug: Web/JavaScript/Reference/Global_Objects/Function/isGenerator +tags: + - Function + - JavaScript + - Method + - Non-standard +translation_of: Archive/Web/JavaScript/Function.isGenerator +--- +
+ {{JSRef("Global_Objects", "Function")}} {{non-standard_header}}
+

Сводка

+

Метод isGenerator() определяет, является ли функция генератором.

+

Синтаксис

+
fun.isGenerator()
+

Описание

+

Метод isGenerator() определяет, является ли функция fun генератором. Он является частью раннего предложения Harmony, но не был включён в спецификацию ECMAScript 6.

+

Примеры

+
function f() {}
+
+function g() {
+  yield 42;
+}
+
+console.log('f.isGenerator() = ' + f.isGenerator()); // f.isGenerator() = false
+console.log('g.isGenerator() = ' + g.isGenerator()); // g.isGenerator() = true
+
+

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

+

Не является частью какой-либо спецификации. Реализована в JavaScript 1.8.6.

+

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

+
+ {{CompatibilityTable}}
+
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatGeckoDesktop("5.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
+
+
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatNo}}{{CompatNo}}{{CompatGeckoMobile("5.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
+
+

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

+ diff --git a/files/ru/web/javascript/reference/global_objects/function/length/index.html b/files/ru/web/javascript/reference/global_objects/function/length/index.html new file mode 100644 index 0000000000..e65e361f17 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/length/index.html @@ -0,0 +1,145 @@ +--- +title: Function.length +slug: Web/JavaScript/Reference/Global_Objects/Function/length +tags: + - Function + - JavaScript + - Property + - Reference +translation_of: Web/JavaScript/Reference/Global_Objects/Function/length +--- +
{{JSRef("Global_Objects", "Function")}}
+ +

Сводка

+

Свойство length определяет количество аргументов, ожидаемых функцией.

+ +
{{js_property_attributes(0, 0, 1)}}
+ +

Описание

+

Свойство length является свойством объекта функции и указывает, сколько аргументов ожидает функция, то есть, количество формальных параметров. Это количество не включает {{jsxref("rest_parameters", "остаточные параметры", "", 1)}}. В отличие от него, свойство {{jsxref("Functions_and_function_scope/arguments/length", "arguments.length")}} является локальным для функции и предоставляет количество аргументов, реально переданных в функцию.

+ +

Свойство данных конструктора Function

+

Конструктор {{jsxref("Global_Objects/Function", "Function")}} сам является объектом {{jsxref("Global_Objects/Function", "Function")}}. Его свойство данных length имеет значение 1. Атрибуты свойства: записываемое: false, перечисляемое: false, настраиваемое: true.

+ +

Свойство объекта прототипа Function

+

Свойство length объекта прототипа {{jsxref("Global_Objects/Function", "Function")}} имеет значение 0.

+ +

Примеры

+
console.log(Function.length); /* 1 */
+
+console.log((function()        {}).length); /* 0 */
+console.log((function(a)       {}).length); /* 1 */
+console.log((function(a, b)    {}).length); /* 2 и так далее */
+console.log((function(...args) {}).length); /* 0, остаточные параметры не считаются */
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарии
ECMAScript 1-е издание.СтандартИзначальное определение. Реализована в JavaScript 1.1.
+ Свойство length конструктора {{jsxref("Global_Objects/Function", "Function")}}:
+ {{SpecName('ES5.1', '#sec-15.3.3.2', 'Function.length')}}
+ Свойство length объекта прототипа {{jsxref("Global_Objects/Function", "Function")}}:
+ {{SpecName('ES5.1', '#sec-properties-of-the-function-prototype-object', 'Function.length')}}
+ Свойство length экземпляров объекта {{jsxref("Global_Objects/Function", "Function")}}:
+ {{SpecName('ES5.1', '#sec-15.3.5.1', 'Function.length')}} +
{{Spec2('ES5.1')}} 
+ Свойство length конструктора {{jsxref("Global_Objects/Function", "Function")}}:
+ {{SpecName('ES6', '#sec-function.length', 'Function.length')}}
+ Свойство length объекта прототипа {{jsxref("Global_Objects/Function", "Function")}}:
+ {{SpecName('ES6', '#sec-15.3.4', 'Function.length')}}
+ Свойство length экземпляров объекта {{jsxref("Global_Objects/Function", "Function")}}:
+ {{SpecName('ES6', '#sec-function-instances-length', 'Function.length')}}
+
{{Spec2('ES6')}} 
+ +

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

+
{{CompatibilityTable}}
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
Поддержка настраиваемости{{CompatUnknown}}{{CompatGeckoDesktop(37)}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
Поддержка настраиваемости{{CompatUnknown}}{{CompatUnknown}}{{CompatGeckoMobile(37)}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+ +

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

+ diff --git a/files/ru/web/javascript/reference/global_objects/function/name/index.html b/files/ru/web/javascript/reference/global_objects/function/name/index.html new file mode 100644 index 0000000000..212b9cb735 --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/name/index.html @@ -0,0 +1,219 @@ +--- +title: Function.name +slug: Web/JavaScript/Reference/Global_Objects/Function/name +tags: + - ECMAScript6 + - Function + - JavaScript + - Property + - Reference +translation_of: Web/JavaScript/Reference/Global_Objects/Function/name +--- +

{{JSRef}}

+ +

Read-only свойство name глобального объекта {{jsxref("Function")}} и его экзепляров содержит название функции созданное во время определения функции или присваивания ссылки на функцию переменной, свойству, аргументу и т. п. Для анонимных функций это свойство может иметь значение "anonymous" или пустую строку  "".

+ +

{{EmbedInteractiveExample("pages/js/function-name.html")}}

+ +

Интерактивные примеры размещены в GitHub репозитории. Если вы хотите добавить свои примеры, то клонируйте https://github.com/mdn/interactive-examples и пришлите пулл реквест.

+ +

{{js_property_attributes(0,0,1)}}
+  

+ +
+

Заметьте, что в нестандартном, pre-ES2015 релизе configurable свойство было false

+
+ +

Примеры

+ +

Имя объявленной функции

+ +

Свойство name возвращает имя функции, либо пустую строку для анонимных функций:

+ +
function doSomething() {}
+
+alert(doSomething.name); // выведет "doSomething"
+
+ +

Имя функции-конструктора

+ +

Функции, созданные синтаксисом new Function(...) или просто Function(...) создают  {{jsxref("Function")}} и имеют name "anonymous":​​​

+ +
(new Function).name; // "anonymous"
+
+ +

Предполагаемые имена функций

+ +

Переменные и методы могут предположить название анонимной функции из ее синтаксической позиции  (new in ECMAScript 2015).

+ +
var f = function() {};
+var object = {
+  someMethod: function() {}
+};
+
+console.log(f.name); // "f"
+console.log(object.someMethod.name); // "someMethod"
+ +

Вы можете определить функцию с именем в {{jsxref("Operators/Function", "function expression", "", 1)}}:

+ +
var object = {
+  someMethod: function object_someMethod() {}
+};
+console.log(object.someMethod.name); // выведет "object_someMethod"
+
+try { object_someMethod } catch(e) { console.log(e); }
+// ReferenceError: object_someMethod is not defined
+
+ +

Вы не можете изменить имя функции, это свойство только для чтения:

+ +
var object = {
+  // анонимная функция
+  someMethod: function() {}
+};
+
+object.someMethod.name = 'otherMethod';
+alert(object.someMethod.name); //someMethod
+
+
+ +

Для изменения name можно использовать {{jsxref("Object.defineProperty()")}}.

+ +

Сокращенные имена методов

+ +
var o = {
+  foo(){}
+};
+o.foo.name; // "foo";
+ +

Имена функций после байндинга

+ +

{{jsxref("Function.bind()")}} производит функцию, получающую имя "bound  и название самой функции.

+ +
function foo() {};
+foo.bind({}).name; // "bound foo"
+
+ +

Имена функций для getters и setters

+ +

Когда используются get и set, "get" и "set" появятся в имени функции.

+ +
let o = {
+  get foo(){},
+  set foo(x){}
+};
+
+var descriptor = Object.getOwnPropertyDescriptor(o, "foo");
+descriptor.get.name; // "get foo"
+descriptor.set.name; // "set foo";
+ +

Имена функций-классов

+ +

Можно использовать obj.constructor.name чтобы проверить "class" объекта (читайте предупреждение ниже):

+ +
function Foo() {}  // ES2015 Syntax: class Foo {}
+
+var fooInstance = new Foo();
+console.log(fooInstance.constructor.name); // logs "Foo"
+
+ +
+

Warning: Интерпретатор объявит встроенное Function.name свойство только если функция не имеет своего собственного свойства name (см.  9.2.11 of the ECMAScript2015 Language Specification). Однако, в ES2015 статичные методы перезаписывают OwnProperty конструкторов класса-функции (ECMAScript2015, 14.5.14.21.b + 12.2.6.9).

+
+ +

Таким образом, нельзя получить доступ к name любого класса со статичным свойством name()​​​​​​:

+ +
class Foo {
+  constructor() {}
+  static name() {}
+}
+
+ +

Со static name() методом Foo.name больше не содержит название класса, но отсылает к функции name(). Приведенное выше определение класса в ES2015 будет вести себя в Chrome и Firefx как в  ES5:

+ +
function Foo() {}
+Object.defineProperty(Foo, 'name', { writable: true });
+Foo.name = function() {};
+ +

Пытаясь получить доступ к fooInstance с помощью fooInstance.constructor.name не даст название класса, но выведет метод name(). Пример:

+ +
let fooInstance = new Foo();
+console.log(fooInstance.constructor.name); // logs function name()
+ +

Из ES5 syntax примера также видно, что в Chrome или Firefox статичное определение Foo.name становится записываемым (writable). Встроенное определение в отсутствии кастомного статичного методадоступно только для чтения:

+ +
Foo.name = 'Hello';
+console.log(Foo.name); // logs "Hello" if class Foo has a static name() property but "Foo" if not.
+ +

Следовательно не ожидайте, что Function.name свойство будет всегда содержать имя класса.

+ +

Имена функций-символов

+ +

Если у {{jsxref("Symbol")}} объявляется имя, то название метода - это имя квадратных скобках.

+ +
let sym1 = Symbol("foo");
+let sym2 = Symbol();
+let o = {
+  [sym1]: function(){},
+  [sym2]: function(){}
+};
+
+o[sym1].name; // "[foo]"
+o[sym2].name; // ""
+
+ +

JavaScript минифицированный

+ +
+

Warning: Будьте осторожны, используя Function.name и изменения source кода с помощью JavaScript compressors (minifiers) или обфускаторов. Эти инструменты часто используются, как встроенные в  JavaScript build pipeline, чтобы сократить размер билда перед деплоем в production. Такие трансформации часто изменяют имена функций.

+
+ +

Такой source code:

+ +
function Foo() {};
+let foo = new Foo();
+
+if (foo.constructor.name === 'Foo') {
+  console.log("'foo' is an instance of 'Foo'");
+} else {
+  console.log('Oops!');
+}
+ +

может быть сжат в:

+ +
function a() {};
+let b = new a();
+if (b.constructor.name === 'Foo') {
+  console.log("'foo' is an instance of 'Foo'");
+} else {
+  console.log('Oops!');
+}
+ +

В несжатой версии код выполняется ожидаемо "'foo' is an instance of 'Foo'". В то время, как в сжатой версии он ведет себя иначе. Если вы полагаетесь на Function.name, как в примере, то убедитесь, что pipeline не меняет код или не ожидайте от функции определенного имени.

+ + + + + + + + + + + + + + +
+

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

+
СтатусКомментарии
{{SpecName('ES6', '#sec-name', 'name')}}{{Spec2('ES6')}}Изначальное определение.
+ +

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

+ + + +

{{Compat("javascript.builtins.Function.name")}}

+ +
diff --git a/files/ru/web/javascript/reference/global_objects/function/prototype/index.html b/files/ru/web/javascript/reference/global_objects/function/prototype/index.html new file mode 100644 index 0000000000..66a3ecc18e --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/prototype/index.html @@ -0,0 +1,151 @@ +--- +title: Function.prototype +slug: Web/JavaScript/Reference/Global_Objects/Function/prototype +tags: + - Function + - JavaScript + - Property + - Prototype + - Reference + - Référence(2) +translation_of: Web/JavaScript/Reference/Global_Objects/Function +--- +
{{JSRef("Global_Objects", "Function")}}
+ +

Сводка

+ +

Свойство Function.prototype представляет прототип объекта {{jsxref("Global_Objects/Function", "Function")}}.

+ +

Описание

+ +

Объекты {{jsxref("Global_Objects/Function", "Function")}} наследуются от Function.prototype. Объект Function.prototype не может быть изменён.

+ +

Свойства

+ +
+
{{jsxref("Function.arguments")}} {{deprecated_inline}}
+
Массив, соответствующий аргументам, переданным в функцию. Это устаревшее свойство {{jsxref("Global_Objects/Function", "Function")}}, используйте вместо него объект {{jsxref("Functions_and_function_scope/arguments", "arguments")}}, доступный внутри функции.
+
{{jsxref("Function.arity")}} {{obsolete_inline}}
+
Использовалось для определения количества аргументов, ожидаемых функцией, но было удалено. Вместо него используйте свойство {{jsxref("Function.length", "length")}}.
+
{{jsxref("Function.caller")}} {{non-standard_inline}}
+
Определяет функцию, вызвавшую текущую выполняющуюся функцию.
+
{{jsxref("Function.length")}}
+
Определяет количество аргументов, ожидаемых функцией.
+
{{jsxref("Function.name")}} {{non-standard_inline}}
+
Имя функции.
+
{{jsxref("Function.displayName")}} {{non-standard_inline}}
+
Отображаемое имя функции.
+
Function.prototype.constructor
+
Определяет функцию, создающую прототип объекта. Смотрите документацию по {{jsxref("Object.prototype.constructor")}}.
+
+ +

Методы

+ +
+
{{jsxref("Function.prototype.apply()")}}
+
Вызывает функцию и устанавливает this в контекст предоставленного значения; аргументы передаются объектом {{jsxref("Global_Objects/Array", "Array")}}.
+
{{jsxref("Function.prototype.bind()")}}
+
Создаёт новую функцию, которая, при вызове, самостоятельно вызывает эту функцию в контексте предоставленного значения, с данной последовательностью аргументов, предшествующих любым аргументам, переданным в новую функцию при её вызове. Устанавливает this в контекст предоставленного значения.
+
{{jsxref("Function.prototype.call()")}}
+
Вызывает (выполняет) функцию и устанавливает this в контекст предоставленного значения; аргументы передаются как есть.
+
{{jsxref("Function.prototype.isGenerator()")}} {{non-standard_inline}}
+
Возвращает true, если функция является генератором; в противном случае возвращает false.
+
{{jsxref("Function.prototype.toSource()")}} {{non-standard_inline}}
+
Возвращает строку, представляющую исходный код функции. Переопределяет метод {{jsxref("Object.prototype.toSource")}}.
+
{{jsxref("Function.prototype.toString()")}}
+
Возвращает строку, представляющую исходный код функции. Переопределяет метод {{jsxref("Object.prototype.toString")}}.
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарии
{{SpecName('ES1')}}{{Spec2('ES1')}}Изначальное определение. Реализована в JavaScript 1.1.
{{SpecName('ES5.1', '#sec-15.3.3.1', 'Function.prototype')}}
+ Для экземпляров объекта {{jsxref("Global_Objects/Function", "Function")}}:
+ {{SpecName('ES5.1', '#sec-15.3.5.2', 'Function.prototype')}}
{{Spec2('ES5.1')}} 
{{SpecName('ES6', '#sec-function.prototype', 'Function.prototype')}}
+ Для экземпляров объекта {{jsxref("Global_Objects/Function", "Function")}}:
+ {{SpecName('ES6', '#sec-function-instances-prototype', 'Function.prototype')}}
{{Spec2('ES6')}} 
{{SpecName('ESDraft', '#sec-function-instances-prototype', 'Function.prototype')}}{{Spec2('ESDraft')}} 
+ +

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

+ +
{{CompatibilityTable}}
+ +
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +

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

+ + diff --git a/files/ru/web/javascript/reference/global_objects/function/tosource/index.html b/files/ru/web/javascript/reference/global_objects/function/tosource/index.html new file mode 100644 index 0000000000..335967947b --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/tosource/index.html @@ -0,0 +1,87 @@ +--- +title: Function.prototype.toSource() +slug: Web/JavaScript/Reference/Global_Objects/Function/toSource +tags: + - Function + - JavaScript + - Method + - Non-standard +translation_of: Web/JavaScript/Reference/Global_Objects/Function/toSource +--- +
+ {{JSRef("Global_Objects", "Function")}} {{non-standard_header}}
+

Сводка

+

Метод toSource() возвращает строку, представляющую исходный код объекта.

+

Синтаксис

+
function.toSource();
+Function.toSource();
+
+

Параметры

+

Нет.

+

Описание

+

Метод toSource возвращает следующие значения:

+ +

Этот метод обычно вызывается внутренними механизмаим движка JavaScript, а не явно в коде. Вы можете вызвать toSource во время отладки для изучения содержимого объекта.

+

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

+

Не является частью какого-либо стандарта. Реализована в JavaScript 1.3.

+

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

+
+ {{CompatibilityTable}}
+
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatNo}}{{CompatVersionUnknown}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatUnknown}}{{CompatUnknown}}{{CompatVersionUnknown}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+

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

+ diff --git a/files/ru/web/javascript/reference/global_objects/function/tostring/index.html b/files/ru/web/javascript/reference/global_objects/function/tostring/index.html new file mode 100644 index 0000000000..70b6522ebe --- /dev/null +++ b/files/ru/web/javascript/reference/global_objects/function/tostring/index.html @@ -0,0 +1,110 @@ +--- +title: Function.prototype.toString() +slug: Web/JavaScript/Reference/Global_Objects/Function/toString +tags: + - Function + - JavaScript + - Method + - Prototype +translation_of: Web/JavaScript/Reference/Global_Objects/Function/toString +--- +
{{JSRef("Global_Objects", "Function")}}
+ +

Сводка

+

Метод toString() возвращает строку, представляющую исходный код функции.

+ +

Синтаксис

+
function.toString(indentation)
+ +

Параметры

+
+
indentation {{non-standard_inline}} {{obsolete_inline(17)}}
+
Количество пробелов для отступов в строковом представлении исходного кода. Если параметр меньше или равен -1, большинство ненужных пробелов будет удалено.
+
+ +

Описание

+

Объект {{jsxref("Global_Objects/Function", "Function")}} переопределяет метод {{jsxref("Object.prototype.toString", "toString")}}, унаследованный из объекта {{jsxref("Global_Objects/Object", "Object")}}; он не наследует метод {{jsxref("Object.prototype.toString")}}. Для объектов {{jsxref("Global_Objects/Function", "Function")}} метод toString возвращает строку, представляющую объект в форме объявления функции. То есть, метод toString декомпилирует функцию и возвращает строку, включающую ключевое слово function, список аргументов, фигурные скобки и исходный код тела функции.

+

JavaScript вызывает метод toString автоматически в случае, когда объект {{jsxref("Global_Objects/Function", "Function")}} представляется в качестве текстового значения, то есть, когда функция соединяется со строкой.

+ +

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

+ + + + + + + + + + + + + + + + + + + + + + + +
СпецификацияСтатусКомментарии
ECMAScript 1-е издание.СтандартИзначальное определение. Реализована в JavaScript 1.1.
{{SpecName('ES5.1', '#sec-15.3.4.2', 'Function.prototype.toString')}}{{Spec2('ES5.1')}} 
{{SpecName('ES6', '#sec-function.prototype.tostring', 'Function.prototype.toString')}}{{Spec2('ES6')}} 
+ +

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

+
{{CompatibilityTable}}
+
+ + + + + + + + + + + + + + + + + + + +
ВозможностьChromeFirefox (Gecko)Internet ExplorerOperaSafari
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+
+ + + + + + + + + + + + + + + + + + + + + +
ВозможностьAndroidChrome для AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Базовая поддержка{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}{{CompatVersionUnknown}}
+
+ +

Особый случай с Gecko

+

Начиная с Gecko 17.0 {{geckoRelease("17")}}, метод Function.prototype.toString() реализован с сохранением исходного кода функции. Декомпилятор был удалён, так что параметр indentation больше не требуется. Смотрите {{bug("761723")}} для подробностей.

+ +

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

+ -- cgit v1.2.3-54-g00ecf