Baseline Widely available
СводкаÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑÑелоÑнÑÑ ÑÑнкÑий имеÑÑ Ð±Ð¾Ð»ÐµÐµ коÑоÑкий ÑинÑакÑÐ¸Ñ Ð¿Ð¾ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ ÑÑнкÑионалÑнÑми вÑÑажениÑми и лекÑиÑеÑки пÑивÑÐ·Ð°Ð½Ñ Ðº знаÑÐµÐ½Ð¸Ñ this (но не пÑивÑÐ·Ð°Ð½Ñ Ðº ÑобÑÑÐ²ÐµÐ½Ð½Ð¾Ð¼Ñ this, arguments, super, или new.target). ÐÑÑажение ÑÑÑелоÑнÑÑ ÑÑнкÑий не позволÑÑÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ Ð¸Ð¼Ñ, поÑÑÐ¾Ð¼Ñ ÑÑÑелоÑнÑе ÑÑнкÑии анонимнÑ, еÑли Ð¸Ñ Ð½Ð¸ к ÑÐµÐ¼Ñ Ð½Ðµ пÑиÑвоиÑÑ.
СинÑакÑÐ¸Ñ ÐазовÑй ÑинÑакÑиÑ(param1, param2, â¦, paramN) => { statements }
(param1, param2, â¦, paramN) => expression
// ÑквиваленÑно: (param1, param2, â¦, paramN) => { return expression; }
// ÐÑÑглÑе Ñкобки не обÑзаÑелÑÐ½Ñ Ð´Ð»Ñ ÐµÐ´Ð¸Ð½ÑÑвенного паÑамеÑÑа:
(singleParam) => { statements }
singleParam => { statements }
// ФÑнкÑÐ¸Ñ Ð±ÐµÐ· паÑамеÑÑов нÑждаеÑÑÑ Ð² кÑÑглÑÑ
ÑкобкаÑ
:
() => { statements }
() => expression
// ÐквиваленÑно: () => { return expression; }
РаÑÑиÑеннÑй ÑинÑакÑиÑ
// Ðогда возвÑаÑаеÑе лиÑеÑалÑное вÑÑажение обÑекÑа, заклÑÑиÑе Ñело в Ñкобки
params => ({foo: bar})
// ÐÑÑаÑоÑнÑе паÑамеÑÑÑ Ð¸ паÑамеÑÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ
(param1, param2, ...rest) => { statements }
(param1 = defaultValue1, param2, â¦, paramN = defaultValueN) => { statements }
// ÐеÑÑÑÑкÑÑÑизаÑÐ¸Ñ Ñоже поддеÑживаеÑÑÑ
var f = ([a, b] = [1, 2], {x: c} = {x: a + b}) => a + b + c;
f(); // 6
ÐпиÑание
СмоÑÑиÑе Ñакже "ES6 In Depth: Arrow functions" on hacks.mozilla.org.
Ðва ÑакÑоÑа повлиÑли на поÑвление ÑÑÑелоÑнÑÑ
ÑÑнкÑии: более коÑоÑкий ÑинÑакÑÐ¸Ñ Ð¸ лекÑика this
.
РнекоÑоÑÑÑ ÑÑнкÑионалÑнÑÑ ÑÐ°Ð±Ð»Ð¾Ð½Ð°Ñ Ð¿ÑивеÑÑÑвÑÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ коÑоÑкие ÑÑнкÑии. СÑавниÑе:
var elements = ["Hydrogen", "Helium", "Lithium", "Beryllium"];
elements.map(function (element) {
return element.length;
}); // ÐÑо вÑÑажение веÑнÑÑ Ð¼Ð°ÑÑив [8, 6, 7, 9]
// ФÑнкÑÐ¸Ñ Ð²ÑÑе можно запиÑаÑÑ ÐºÐ°Ðº ÑÑÑелоÑнÑÑ ÑÑнкÑиÑ:
elements.map((element) => {
return element.length;
}); // [8, 6, 7, 9]
// ÐÑли единÑÑвеннÑм опеÑаÑоÑом в вÑÑажении ÑÑÑелоÑной ÑÑнкÑии ÑвлÑеÑÑÑ return,
// можно ÑдалиÑÑ return и окÑÑжаÑÑие ÑигÑÑнÑе Ñкобки
elements.map((element) => element.length); // [8, 6, 7, 9]
// Рданном ÑлÑÑае, поÑколÑÐºÑ Ð½Ð°Ð¼ нÑжно ÑолÑко ÑвойÑÑво length, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð´ÐµÑÑÑÑкÑÑÑизиÑованнÑй паÑамеÑÑ:
// ÐбÑаÑиÑе внимание, ÑÑо ÑÑÑока `"length"` ÑооÑвеÑÑÑвÑÐµÑ ÑвойÑÑвÑ, коÑоÑое Ð¼Ñ Ñ
оÑим полÑÑиÑÑ,
// в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº `lengthFooBArX` ÑÑо пÑоÑÑо Ð¸Ð¼Ñ Ð¿ÐµÑеменной, коÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ назваÑÑ ÐºÐ°Ðº Ð²Ñ Ñ
оÑиÑе
elements.map(({ length: lengthFooBArX }) => lengthFooBArX); // [8, 6, 7, 9]
// ÐÑо задание деÑÑÑÑкÑÑÑизиÑованного паÑамеÑÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿Ð¸Ñано, как показано ниже. Тем не менее, обÑаÑиÑе внимание,
// ÑÑо Ð½ÐµÑ ÑÑÑоки `"length"`, ÑÑÐ¾Ð±Ñ Ð²ÑбÑаÑÑ, какое ÑвойÑÑво Ð¼Ñ Ñ
оÑим полÑÑиÑÑ. ÐмеÑÑо ÑÑого в каÑеÑÑве ÑвойÑÑва,
// коÑоÑое Ð¼Ñ Ñ
оÑим извлеÑÑ Ð¸Ð· обÑекÑа, иÑполÑзÑеÑÑÑ Ñамо лиÑеÑалÑное Ð¸Ð¼Ñ Ð¿ÐµÑеменной `length`
elements.map(({ length }) => length); // [8, 6, 7, 9]
ÐÑÑÑÑÑÑвие ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ Ñ this
Ðо поÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑÑÑелоÑнÑÑ
ÑÑнкÑий, ÐºÐ°Ð¶Ð´Ð°Ñ Ð½Ð¾Ð²Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¸Ð¼ÐµÐ»Ð° ÑÐ²Ð¾Ñ Ð·Ð½Ð°Ñение this
(новÑй обÑÐµÐºÑ Ð² ÑлÑÑае конÑÑÑÑкÑоÑа, undefined в strict Ñежиме вÑзова ÑÑнкÑии, конÑекÑÑ Ð¾Ð±ÑекÑа пÑи вÑзове ÑÑнкÑии как "меÑода обÑекÑа" и Ñ.д.). ÐÑо оÑÐµÐ½Ñ ÑаздÑажало пÑи иÑполÑзовании обÑекÑно-оÑиенÑиÑованного ÑÑÐ¸Ð»Ñ Ð¿ÑогÑаммиÑованиÑ.
function Person() {
// РконÑÑÑÑкÑоÑе Person() `this` ÑказÑÐ²Ð°ÐµÑ Ð½Ð° ÑебÑ.
this.age = 0;
setInterval(function growUp() {
// РнеÑÑÑогом Ñежиме, в ÑÑнкÑии growUp() `this` ÑказÑваеÑ
// на глобалÑнÑй обÑекÑ, коÑоÑÑй оÑлиÑаеÑÑÑ Ð¾Ñ `this`,
// опÑеделÑемом в конÑÑÑÑкÑоÑе Person().
this.age++;
}, 1000);
}
var p = new Person();
Ð ECMAScript 3/5, Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ñоблема ÑеÑалаÑÑ Ð¿ÑиÑваиванием знаÑÐµÐ½Ð¸Ñ this
пеÑеменной:
function Person() {
var that = this;
that.age = 0;
setInterval(function growUp() {
// ФÑнкÑÐ¸Ñ Ñ Ð¾Ð±ÑаÑнÑм вÑзовом(callback) ÑодеÑÐ¶Ð¸Ñ Ð¿ÐµÑеменнÑÑ that, коÑоÑаÑ
// ÑÑÑлаеÑÑÑ Ð½Ð° ÑÑебÑемÑй обÑÐµÐºÑ this.
that.age++;
}, 1000);
}
ÐÑоме ÑÑого, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñоздана пÑивÑÐ·Ð°Ð½Ð½Ð°Ñ ÑÑнкÑиÑ, в коÑоÑÑÑ Ð¿ÐµÑедаÑÑÑÑ ÑÑебÑемое знаÑение this
Ð´Ð»Ñ ÑÑнкÑии (ÑÑнкÑÐ¸Ñ growUp()
в пÑимеÑе вÑÑе).
СÑÑелоÑнÑе ÑÑнкÑии не ÑодеÑÐ¶Ð°Ñ ÑобÑÑвеннÑй конÑекÑÑ this
, а иÑполÑзÑÑÑ Ð·Ð½Ð°Ñение this
окÑÑжаÑÑего конÑекÑÑа. ÐоÑÑÐ¾Ð¼Ñ Ð½Ð¸Ð¶ÐµÐ¿ÑиведÑннÑй код ÑабоÑÐ°ÐµÑ ÐºÐ°Ðº пÑедполагалоÑÑ:
function Person() {
this.age = 0;
setInterval(() => {
this.age++; // `this` ÑказÑÐ²Ð°ÐµÑ Ð½Ð° обÑÐµÐºÑ Person
}, 1000);
}
var p = new Person();
СÑÑогий Ñежим иÑполнениÑ
ÐоÑколÑÐºÑ Ð·Ð½Ð°Ñение this
опÑеделÑеÑÑÑ Ð»ÐµÐºÑикой, пÑавила ÑÑÑогого Ñежима (strict mode) оÑноÑиÑелÑно this
игноÑиÑÑÑÑÑÑ:
var f = () => {
"use strict";
return this;
};
f() === window; // или глобалÑнÑй обÑекÑ
ÐÑе оÑÑалÑнÑе пÑавила ÑÑÑогого Ñежима пÑименÑÑÑÑÑ ÐºÐ°Ðº обÑÑно.
ÐÑзов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ call или applyТак как знаÑение this
опÑеделÑеÑÑÑ Ð»ÐµÐºÑикой, вÑзов ÑÑÑелоÑнÑÑ
ÑÑнкÑий Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑодов call()
или apply()
, даже еÑли пеÑедаÑÑ Ð°ÑгÑменÑÑ Ð² ÑÑи меÑодÑ, не влиÑÐµÑ Ð½Ð° знаÑение this
:
var adder = {
base: 1,
add: function (a) {
var f = (v) => v + this.base;
return f(a);
},
addThruCall: function (a) {
var f = (v) => v + this.base;
var b = {
base: 2,
};
return f.call(b, a);
},
};
console.log(adder.add(1)); // ÐÑÐ²Ð¾Ð´Ð¸Ñ 2
console.log(adder.addThruCall(1)); // ÐÑÑ Ñавно вÑÐ²Ð¾Ð´Ð¸Ñ 2
Ðе Ð¸Ð¼ÐµÐµÑ ÑобÑÑвенного обÑекÑа arguments
СÑÑелоÑнÑе ÑÑнкÑии не имеÑÑ ÑобÑÑвенного обÑекÑа arguments, поÑÑÐ¾Ð¼Ñ Ð² Ñеле ÑÑÑелоÑнÑÑ ÑÑнкÑий arguments бÑÐ´ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° пеÑеменнÑÑ Ð² окÑÑжаÑÑей облаÑÑи.
var arguments = 42;
var arr = () => arguments;
arr(); // 42
function foo() {
var f = (i) => arguments[0] + i; // ÐеÑвное ÑвÑзÑвание ÑÑÑлки arguments
// ÑÑÑелоÑной ÑÑнкÑии f
// c обÑекÑом arguments ÑÑнкÑии foo
return f(2);
}
foo(1); // 3
РболÑÑинÑÑве ÑлÑÑаев лÑÑÑей заменой обÑекÑа arguments в ÑÑÑелоÑнÑÑ ÑÑнкÑиÑÑ ÑвлÑÑÑÑÑ Ð¾ÑÑаÑоÑнÑе паÑамеÑÑÑ:
function foo() {
var f = (...args) => args[0];
return f(2);
}
foo(1); // 2
ÐÑполÑзование ÑÑÑелоÑнÑÑ
ÑÑнкÑий как меÑодов
Ðак показано Ñанее, ÑÑÑелоÑнÑе ÑÑнкÑии лÑÑÑе вÑего Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ Ð´Ð»Ñ ÑÑнкÑий без меÑодов. ÐоÑмоÑÑим, ÑÑо бÑдеÑ, когда Ð¼Ñ Ð¿Ð¾Ð¿ÑобÑем Ð¸Ñ Ð¸ÑполÑзоваÑÑ ÐºÐ°Ðº меÑодÑ:
"use strict";
var obj = {
i: 10,
b: () => console.log(this.i, this),
c: function () {
console.log(this.i, this);
},
};
obj.b(); // prints undefined, Window {...} (или глобалÑнÑй обÑекÑ)
obj.c(); // prints 10, Object {...}
СÑÑелоÑнÑе ÑÑнкÑии не обÑÑвлÑÑÑ Ð¿ÑивÑÐ·ÐºÑ ("bind") иÑ
конÑекÑÑа this
. ÐÑÑгой пÑÐ¸Ð¼ÐµÑ Ð²ÐºÐ»ÑÑÐ°ÐµÑ Object.defineProperty()
:
"use strict";
var obj = {
a: 10,
};
Object.defineProperty(obj, "b", {
get: () => {
console.log(this.a, typeof this.a, this);
return this.a + 10;
// пÑедÑÑавлÑÐµÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй обÑÐµÐºÑ 'Window', но 'this.a' возвÑаÑÐ°ÐµÑ 'undefined'
},
});
ÐÑполÑзование опеÑаÑоÑа new
СÑÑелоÑнÑе ÑÑнкÑии не могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ ÐºÐ°Ðº конÑÑÑÑкÑÐ¾Ñ Ð¸ вÑзовÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¿Ñи иÑполÑзовании Ñ new
:
var a = new (function () {})();
// пеÑеменной "a" бÑÐ´ÐµÑ Ð¿ÑиÑвоено знаÑение ÑкземплÑÑа анонимной ÑÑнкÑии
var b = new (() => {})();
// бÑÐ´ÐµÑ Ð²ÑбÑоÑено иÑклÑÑение
// Uncaught TypeError: (intermediate value) is not a constructor
ÐÑполÑзование клÑÑевого Ñлова yield
ÐлÑÑевое Ñлово yield
не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзовано в Ñеле ÑÑÑелоÑной ÑÑнкÑии (за иÑклÑÑением ÑлÑÑаев, когда ÑазÑеÑаеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð² ÑÑнкÑиÑÑ
, вложеннÑÑ
в Ñело ÑÑÑелоÑной ÑÑнкÑии). Ðак ÑледÑÑвие ÑÑÑелоÑнÑе ÑÑнкÑии не могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ ÐºÐ°Ðº генеÑаÑоÑÑ.
Тело ÑÑÑелоÑной ÑÑнкÑии Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÐºÑаÑкÑÑ (concise body) или блоÑнÑÑ (block body) ÑоÑмÑ.
ÐлоÑÐ½Ð°Ñ ÑоÑма не возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ñвно веÑнÑÑÑ Ð·Ð½Ð°Ñение.
var func = (x) => x * x; // кÑаÑкий ÑинÑакÑиÑ,
// неÑвно возвÑаÑÐ°ÐµÑ ÑезÑлÑÑаÑ
var func = (x, y) => {
return x + y;
}; // блоÑнÑй ÑинÑакÑиÑ,
// Ñвно возвÑаÑÐ°ÐµÑ ÑезÑлÑÑаÑ
ÐозвÑаÑаемÑе обÑекÑнÑе ÑÑÑоки (лиÑеÑалÑ)
ÐомниÑе о Ñом, ÑÑо возвÑаÑаемÑе обÑекÑнÑе ÑÑÑоки иÑполÑзÑÑÑ ÑокÑаÑÑннÑй ÑинÑакÑиÑ: params => {object:literal}
бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð½Ðµ Ñак, как ожидаеÑÑÑ.
var func = () => { foo: 1 };
// ÐÑзов func() возвÑаÑÐ°ÐµÑ undefined!
var func = () => { foo: function() {} };
// SyntaxError: function statement requires a name
ÐÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ÑÐ¾Ð¼Ñ ÑÑо код в ÑкобкаÑ
({}) ÑаÑпознаÑÑÑÑ ÐºÐ°Ðº ÑепоÑка вÑÑажений (Ñ.е. foo
ÑÑакÑÑеÑÑÑ ÐºÐ°Ðº наименование, а не как клÑÑ Ð² обÑекÑной ÑÑÑоке).
Ðе забÑвайÑе обоÑаÑиваÑÑ Ñкобками обÑекÑнÑе ÑÑÑоки.
var func = () => ({ foo: 1 });
РазÑÑÐ²Ñ ÑÑÑок
СÑÑелоÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÑазÑÑÐ²Ñ ÑÑÑок Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð°ÑамеÑÑами и ÑÑÑелкой.
var func = ()
=> 1;
// SyntaxError: expected expression, got '=>'
Ð Ð°Ð·Ð±Ð¾Ñ Ð¿Ð¾ÑÑдка ÑледованиÑ
ÐоÑколÑÐºÑ ÑÑÑелка в ÑÑÑелоÑной ÑÑнкÑии не ÑвлÑеÑÑÑ Ð¾Ð¿ÐµÑаÑоÑом, Ñо ÑÑÑелоÑнÑе ÑÑнкÑии имеÑÑ ÑпеÑиалÑнÑе пÑавила ÑазбоÑа (паÑÑинга), коÑоÑÑе взаимодейÑÑвÑÑÑ Ñ Ð¿ÑиоÑиÑеÑами опеÑаÑоÑов инаÑе, Ñем в обÑÑнÑÑ ÑÑнкÑиÑÑ .
let callback;
callback = callback || function() {}; // ok
callback = callback || () => {};
// SyntaxError: invalid arrow-function arguments
callback = callback || (() => {}); // ok
ÐолÑÑе пÑимеÑов
// ÐÑÑÑÐ°Ñ ÑÑÑелоÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ undefined
let empty = () => {};
(() => "foobar")();
// ÐеÑнÑÑ "foobar"
// (ÐÑо Immediately Invoked Function Expression
// ÑмоÑÑи 'IIFE' в ÑпÑавоÑнике)
var simple = (a) => (a > 15 ? 15 : a);
simple(16); // 15
simple(10); // 10
let max = (a, b) => (a > b ? a : b);
// УдобнÑе опеÑаÑии над маÑÑивами: filter, map, ...
var arr = [5, 6, 13, 0, 1, 18, 23];
var sum = arr.reduce((a, b) => a + b);
// 66
var even = arr.filter((v) => v % 2 == 0);
// [6, 0, 18]
var double = arr.map((v) => v * 2);
// [10, 12, 26, 0, 2, 36, 46]
// Ðолее коÑоÑкие ÑепоÑки promise-ов
promise
.then((a) => {
// ...
})
.then((b) => {
// ...
});
// СÑÑелоÑнÑе ÑÑнкÑии без паÑамеÑÑов, коÑоÑÑе визÑалÑно легÑе ÑазбиÑаÑÑ
setTimeout(() => {
console.log("Я бÑÐ´Ñ ÑанÑÑе");
setTimeout(() => {
// deeper code
console.log("Я бÑÐ´Ñ Ð¿Ð¾Ð·Ð¶Ðµ");
}, 1);
}, 1);
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами ÐамеÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Firefox
"use strict";
ÑÑало обÑзаÑелÑнÑм.this
не пÑивÑзано лекÑиÑеÑки.\n
) бÑл оÑибоÑно ÑазÑеÑÑн поÑле аÑгÑменÑов ÑÑÑелоÑной ÑÑнкÑии. ÐÑо бÑло иÑпÑавлено Ð´Ð»Ñ ÑоблÑÐ´ÐµÐ½Ð¸Ñ ÑпеÑиÑикаÑии ES2015, и код вÑоде: () \n => {}
ÑепеÑÑ Ð²ÑзÑÐ²Ð°ÐµÑ SyntaxError
в ÑÑой и более поздниÑ
веÑÑиÑÑ
.RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4