tl; dr: Нет! Функции стрелок и декларации функций / выражения не являются эквивалентными и не могут быть заменены вслепую. Если функция, которую вы хотите заменить, not использует this
, arguments
и не вызывается с new
, тогда да.
Как это часто бывает: это зависит. Функции Arrow имеют другое поведение, чем декларации / выражения функций, поэтому давайте сначала рассмотрим различия:
1. Функции Lexical this
и arguments
не имеют собственных привязок В случае выражения функции, Это делает функции стрелок полезными, если вам нужно получить доступ к Обратите внимание, что это также означает, что не можно установить функцию стрелки Если вы не очень знакомы с 2. Функции стрелок не могут быть вызваны с помощью ES2015 различает функции, доступные call , и функции, которые являются конструкцией . Если функция конструируется, ее можно вызвать с помощью Функции, созданные посредством деклараций / выражений функций, являются конструктивными и вызываемыми. Функции стрелок (и методы) являются только вызываемыми. Если вы пытаетесь вызвать функцию, не вызываемую вызовом, или построить неконструируемую функцию, вы получите ошибку времени выполнения. Зная это, мы можем указать следующее. Сменный: Не сменный: Давайте рассмотрим это более подробно с помощью ваших примеров: Функция конструктора Это не будет работать, потому что функции стрелок нельзя вызвать с помощью Способы прототипа Скорее всего нет, потому что методы прототипа обычно используют Методы объекта Аналогично для методов в объектном литерале. Если метод хочет ссылаться на сам объект через Обратные вызовы Это зависит. Вы должны обязательно заменить его, если вы наложили внешний Но: Если код, вызывающий обратный вызов, явно устанавливает Variadic функции Поскольку функции стрелок не имеют собственных Связанный вопрос: Дополнительные ресурсы: this
или arguments
. Вместо этого эти идентификаторы разрешаются в лексической области, как и любая другая переменная. Это означает, что внутри функции стрелки this
и arguments
относятся к значениям this
и arguments
в окружающей среде, функция стрелки определена в (т.е. «снаружи» стрелка ) // Example using a arrow function
function createObject() {
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: () => console.log('Inside `bar`:', this.foo),
};
}
createObject.call({foo: 21}).bar(); // override `this` inside createObject
this
относится к объекту, который был создан внутри createObject
. В функциональном случае стрелки this
относится к this
самого createObject
. this
текущей среды: // currently common pattern
var that = this;
getData(function(data) {
that.data = data;
});
// better alternative with arrow functions
getData(data => {
this.data = data;
});
this
с .bind
или .call
. this
, рассмотрим чтение new
new
, то есть new User()
. Если функция является вызываемой, ее можно вызвать без new
(т. Е. Вызов нормальной функции). class
конструкторы только конструктивны. this
или arguments
. .bind(this)
this
) arguments
(см. ниже)) new
. Продолжайте использовать объявление / выражение функции или используйте class
. this
для доступа к экземпляру. Если они не используют this
, вы можете его заменить. Однако, если вы в первую очередь заботитесь о сжатом синтаксисе, используйте class
с его синтаксисом сжатого метода: class User {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
this
, продолжайте использовать функциональные выражения или используйте новый синтаксис метода: const obj = {
getName() {
// ...
},
};
this
или используете .bind(this)
: // old
setTimeout(function() {
// ...
}.bind(this), 500);
// new
setTimeout(() => {
// ...
}, 500);
this
на определенное значение , как это часто бывает с обработчиками событий, особенно с jQuery, и обратный вызов использует this
(или arguments
), вы не можете использовать функцию стрелки! arguments
, вы не можете просто заменить их функцией стрелки. Однако ES2015 вводит альтернативу использованию arguments
: параметр rest . // old
function sum() {
let args = [].slice.call(arguments);
// ...
}
// new
const sum = (...args) => {
// ...
};
Если Вы подразумеваете желание их назад как строки в том формате;
SELECT
CONVERT(CHAR(4), date_of_birth, 100) + CONVERT(CHAR(4), date_of_birth, 120)
FROM customers
Тот формат не существует. Необходимо сделать комбинацию двух вещей,
select convert(varchar(4),getdate(),100) + convert(varchar(4),year(getdate()))
( Month(Created) + ',' + Year(Created) ) AS Date
Забавный, я просто играл вокруг выписывания этого того же запроса в SQL Server и затем LINQ.
SELECT
DATENAME(mm, article.Created) AS Month,
DATENAME(yyyy, article.Created) AS Year,
COUNT(*) AS Total
FROM Articles AS article
GROUP BY
DATENAME(mm, article.Created),
DATENAME(yyyy, article.Created)
ORDER BY Month, Year DESC
Это производит следующий ouput (пример).
Month | Year | Total
January | 2009 | 2
select
datepart(month,getdate()) -- integer (1,2,3...)
,datepart(year,getdate()) -- integer
,datename(month,getdate()) -- string ('September',...)
У меня была та же проблема, и, осмотревшись, я обнаружил следующее:
SELECT DATENAME(yyyy, date) AS year
FROM Income
GROUP BY DATENAME(yyyy, date)
Отлично работает!
Как насчет этого?
Select DateName( Month, getDate() ) + ' ' + DateName( Year, getDate() )
Да, вы можете использовать dateName (месяц, intime)
, чтобы получить месяц в тексте.