2016-06-06 8 views
1

У меня есть следующие стрелки функцииПреобразование функции стрелка ECMAScript 6 к регулярной функции

if(rowCheckStatuses.reduce((a, b) => a + b, 0)){}

rowCheckStatuses представляет собой массив из 1 и 0, эта стрелка функция добавляет их все, чтобы произвести ряд. Это число действует как логическое, чтобы определить, есть ли в массиве хотя бы один «1».

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

Как я могу преобразовать это в обычную функцию для решения обеих проблем?

+0

'function (a, b) {return a + b; } ' – Pointy

+0

Очевидно, что это не дубликат. OP спрашивает о преобразовании => в обычные функции. –

+1

@le_m Что было бы тривиально, если бы они поняли их. –

ответ

0

Вы можете реорганизовать как:

if(rowCheckStatuses.reduce(function(a, b){return a + b}, 0) 

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

if(rowCheckStatuses.reduce(function(a, b){return a + b}) 

Этих число действует как логическое значение для определения наличия или отсутствия по крайней мере одного «1» в массиве

Это может быть быстрее (и понятнее) использовать:

if(rowCheckStatuses.some(function(a){return a == 1})) 

который вернет истинную, если есть какие-либо 1s в rowCheckStatuses и вернется, как только один встречается. Другой альтернативой является IndexOf:

if(rowCheckStatuses.indexOf(1) != -1) 

много альтернатив.

+1

Это не технически эквивалентно. Вы теряете лексический 'this', если вы перейдете от функции стрелки к выражению функции. В этом случае это не имеет значения, потому что функция не ссылается на это. Но это хороший момент, чтобы иметь в виду. Хорошая новость - это просто - просто добавьте '.bind (this)' в функцию. –

+1

@ JoeAttardi-хороший момент, но, как вы говорите, лексический * этот * не имеет значения в этом случае. ;-) – RobG

2

Функция стрелка обычно может быть преобразована путем замены

(<args>) => <body> 

с

function(<args>) { return <body>; } 

Так ваш будет

rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0) 

Есть исключения из этого правила, так что это важно, чтобы вы прочитали arrow functions, если вы хотите знать все различия. Следует также отметить, что функции стрелок имеют лексический this.

1

Замена функций стрелок с регулярными функциями является обычно беспроблемное:

var f = x => y; 
var g = function(x) { return y; } 

Или в вашем конкретном примере:

rowCheckStatuses.reduce((a, b) => a + b, 0); 
rowCheckStatuses.reduce(function(a, b) { return a + b; }, 0); 

Однако следует помнить о исключений:

Функции стрелки не связывают this стоимость. Доступ к this в функции стрелки может, таким образом, возвращает значение контекст выполнения вшито-х this:

function MyClass() {} 
 
MyClass.prototype.f =() => this; 
 
MyClass.prototype.g = function() { return this; } 
 

 
myClass = new MyClass(); 
 
console.log(myClass.f()); // logs `Window` 
 
console.log(myClass.g()); // logs `myClass`

функция стрелка также не имеет доступа к локальному arguments объекту. Доступ к arguments в функции стрелки может быть e. г. вернуть arguments из функции включения:

function test() { 
 

 
    var f =() => arguments; 
 
    var g = function() { return arguments; } 
 
    
 
    console.log(f()); // logs test's arguments 
 
    console.log(g()); // logs g's arguments 
 
} 
 

 
test('x');

То же самое справедливо и для new.target и super. См. Также What are the differences (if any) between ES6 arrow functions and functions bound with Function.prototype.bind?

 Смежные вопросы

  • Нет связанных вопросов^_^