Недоволен от другите отговори. Най-гласуваният отговор към 2013/3/13 е фактически грешен.
Кратката лаконична версия на това, което означава =>
, е, че това е пряк път за писане на функция AND за обвързването й към текущия this
const foo = a => a * 2;
На практика е пряк път за
const foo = function(a) { return a * 2; }.bind(this);
Можете да видите всички неща, които са съкратени. Нямахме нужда от function
, нито return
, нито .bind(this)
, нито дори скоби или скоби
Малко по-дълъг пример за функция със стрелка може да бъде
const foo = (width, height) => {
const area = width * height;
return area;
};
Показвайки, че ако искаме множество аргументи към функцията, имаме нужда от скоби и ако искаме да напишем повече от един израз, имаме нужда от скоби и изрично return
.
Важно е да разберете частта .bind
и това е голяма тема. Това е свързано с това какво означава this
в JavaScript.
ВСИЧКИ функции имат скрит параметър, наречен this
. Как се задава this
при извикване на функция зависи от това как се извиква тази функция.
Предприеме
function foo() { console.log(this); }
Ако го наречеш нормално
function foo() { console.log(this); }
foo();
this
ще бъде глобалният обект.
Ако сте в строг режим
`use strict`;
function foo() { console.log(this); }
foo();
// or
function foo() {
`use strict`;
console.log(this);
}
foo();
ще бъде undefined
Можете да зададете this
директно, като използвате call
или apply
function foo(msg) { console.log(msg, this); }
const obj1 = {abc: 123}
const obj2 = {def: 456}
foo.call(obj1, 'hello'); // prints Hello {abc: 123}
foo.apply(obj2, ['hi']); // prints Hi {def: 456}
Можете също така да зададете this
имплицитно, като използвате оператора за точка .
function foo(msg) { console.log(msg, this); }
const obj = {
abc: 123,
bar: foo,
}
obj.bar('Hola'); // prints Hola {abc:123, bar: f}
Проблем възниква, когато искате да използвате функция като обратно извикване или слушател. Създавате клас и искате да присвоите функция като обратно извикване, която осъществява достъп до екземпляр на класа.
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click', function() {
console.log(this.name); // won't work
});
}
}
Кодът по-горе няма да работи, защото когато елементът задейства събитието и извиква функцията, стойността this
няма да бъде екземплярът на класа.
Един често срещан начин за решаване на този проблем е да използвате .bind
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click', function() {
console.log(this.name);
}.bind(this); // <=========== ADDED! ===========
}
}
Защото синтаксисът на стрелката прави същото, което можем да напишем
class ShowName {
constructor(name, elem) {
this.name = name;
elem.addEventListener('click',() => {
console.log(this.name);
});
}
}
bind
ефективно прави нова функция. Ако bind
не съществуваше, всъщност бихте могли да направите свой собствен по този начин
function bind(functionToBind, valueToUseForThis) {
return function(...args) {
functionToBind.call(valueToUseForThis, ...args);
};
}
В по-стария JavaScript без оператора за разпространение би било
function bind(functionToBind, valueToUseForThis) {
return function() {
functionToBind.apply(valueToUseForThis, arguments);
};
}
Разбирането на този код изисква разбиране на затварянията, но кратката версия е bind
прави нова функция, която винаги извиква оригиналната функция със стойността this
, която е била обвързана с нея. Функциите със стрелки правят същото, тъй като те са пряк път за bind(this)
person
gman
schedule
13.03.2019