Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
let sayHappyNewYear = year =>
`Happy New ${year} Year!`;
sayHappyNewYear(2016);
// функция суммы элементов - обычная функция
function sum(arr) {
// а вот тут arrow-functions упрощают код.
return arr.reduce((sum, item) => sum + item, 0);
}
.apply() и .call() использовать с такими функциями бесполезно.arguments, который можно было бы использовать в теле стрелочной функцииsayHappyNewYear, она всегда остается анонимной.function sayHappyNewYear(year) { ... }, например, в глобальном окружении, функцию можно использовать где угодно, хоть после определения, хоть до определения. Переменные, определенные через let, доступны для использования лишь после определения.let foo = new (() => {}); // TypeError
let foo = () => { super() }; // SyntaxError
let foo = () => { new.target }; // SyntaxError
return. Например,function sayHappyNewYear(year) {
return cb => cb(null, `Happy New ${year} Year!`);
}
В остальных случаях использую что-либо отличное от стрелочных функций.myFunction(...iterableObj);
Во-вторых, стрелочные функции не создают объекта arguments, который можно было бы использовать в теле стрелочной функцииИ не надо его использовать, если вы не библиотеку пишете.
В-третьих, несмотря на явное название функции sayHappyNewYear, она всегда остается анонимной.Ваше замечание некорректно. У функции в примере нет названия. Она присваивается именованной переменной.
У функции в примере нет названия. Она присваивается именованной переменной.
let a = (function a () {
...
});
console.log(a.name); // => a
В-четвертых, (не самое главное) определив функцию обычным образом function sayHappyNewYear(year) {… }, например, в глобальном окружении, функцию можно использовать где угодно, хоть после определения, хоть до определения. Переменные, определенные через let, доступны для использования лишь после определения.
let, а ниже делать им описания, — что не очень удобно.let a, b;
a = function () {
b ();
}
b = function() {
a ();
}
function a() {
b ();
}
function b() {
a ();
}
Я бы сказал, что такое ограничение очень даже полезно, потому что, как по мне, такой код читать и использовать удобнее, когда есть определенный порядок. Если же функция может быть определена где-то ниже, то, иногда, это не очень удобно.
var greetHabrauser = createGreeter('Hello, %habrauser%!');
console.log(greetHabrauser("stalkerg"));
> Hello, stalkerg!
let format = (strings, ...keys) =>
(...values) => {
let object = values[values.length - 1],
result = [strings[0]];
keys.forEach((value, index) => {
result.push(object[value], strings[index + 1]);
});
return result.join('');
};
let year = 2016
format `Happy New ${'year'} Year!`({ year });
var greeter = new Greeter;
var newYearGreeter = new NewYearGreeter(2016);
extend(newYearGreeter, greeter);
как много людей пишущих на нормальных ЯП с радостью перешли на JS
(Хотя на нем теперь и сервера и десктоп пишут помимо веб-апп).
И речь не о том, что для каждой задачи свой ЯП, а о том, сколько людей пишущих на этих языках с радостью перешли на JS из-за таких ошеломляющих возможностей и перспектив.
Можно, конечно, вынести все, что связано с форматированием, в отдельную функцию formatMessage() и пропустить через нее поздравление во всех функциях. Но давайте для начала попробуем отразить предметную область с помощью ООП
'use strict';
class Greeter {
doGreeting(msg) {
console.log(msg);
}
}
class NewYearGreeter extends Greeter {
constructor(currentYear) {
super();
this.currentYear = currentYear;
}
doGreeting() {
let year = this.currentYear + 1;
let newYearMsg = 'Happy New ' + year + ' Year!';
super.doGreeting(newYearMsg);
}
}
let newYearGreeter = new NewYearGreeter(2015);
newYearGreeter.doGreeting();
Greeter#doGreeting() объявлен с параметром.NewYearGreeter наследуется от Greeter и является дочерним по отношению к нему.NewYearGreeter#doGreeting() объявлен без параметров.NewYearGreeter#doGreeting() вызывает Greeter#doGreeting() вот этой строкой super.doGreeting(newYearMsg); — вызов с параметром.NewYearGreeter#doGreeting() объявлен без параметров.
NewYearGreeter#doGreeting() здесь нет параметров, но мог бы быть, например, один, но совсем другого назначения, либо даже два или, вообще, переменное множество.#include <iostream>
class A {
public:
int call (const int &year) {
return year;
}
};
class B : public A {
public:
int call () {
return A::call(2015);
}
};
int main() {
B b;
std::cout << b.call();
return 0;
}
void B::call(int year)
void B::call(String year)
function call(year){
if(typeof year == 'string') {
year = parseInt(year);
}
return year;
}
call(2016); // вернет => 2016
call("2016"); // также => 2016
call(); // теперь => undefined
call(2005, 2016); // и опять => 2005
newYearGreeter.doGreeting(123)
newYearGreeter.prototype.prototype.doGreeting.call(newYearGreeter, 2016);
Обзор возможностей современного JavaScript