2016-09-30 2 views
7

Используя Бабеля, я могу видеть, чтоКак использовать функцию стрелки с || Оператор

callback =() => {}; 

компилирует

callback = function callback() {}; 

чего я ожидал. Однако я получаю сообщение об ошибке при попытке использовать его с ||

callback = callback ||() => {} 

Что я ожидал, что эквивалентно

callback = callback || function(){}; 

Почему это ошибка? Кроме того, есть ли более правильная версия ES6 этого знакомого синтаксиса?

+2

Не могли бы вы просто обернуть это 'callback = callback || (() => {}) ' – adeneo

+1

Аналогичным образом вы не можете сразу вызвать'() => {}() '; вам нужно написать '(() => {})()'. –

+1

@ 1252748, Это классическая проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Вы промежуточная цель - назначить функцию переменной, если переменная не установлена, поэтому вы спрашиваете о '||'. Но вы все еще не задавали вопрос о своей основной цели: то есть, каков контекст, в котором этот код написан? Какую проблему ты пытаешься решить? Я подозреваю, что есть гораздо лучшее решение. – naomik

ответ

6

Это не удается, потому что это просто недействительный синтаксис.

Используйте следующие чтобы сделать его работу:

callback = callback || (() => {}) 

Если вы не обернуть его таким образом, это было бы расценено как если бы вы набрали следующее. Но это недопустимый синтаксис.

callback = (callback ||()) => {} 

Продлить по оценке выполнения задания, см спецификацию AssignmentExpression. Он состоит из ConditionalExpression или ArrowFunction (или некоторых других выражений, которые я буду игнорировать). Поэтому интерпретатор попытается использовать ваш код как условный. Но сам () недействителен в этом контексте, так как ожидается выражение внутри что ParenthesizedExpression. В результате он потерпит неудачу. Если вы вместо этого группируете выражение как callback || (() => {}), то обе стороны LogicalOrExpressions являются действительными выражениями.

+1

Я вижу. где в этой таблице есть приоритет для '() => {}'? – 1252748

+0

@ 1252748 Вы правы, ссылка MDN явно не указала функцию стрелки. Я добавил еще немного контекста к моему ответу, надеюсь, что это поможет. – str

+1

хорошее объяснение - как будто сам переводчик говорит: D – ftor

4

Благодаря старшинство операторов, вы должны обернуть функцию стрелки в скобках, чтобы заставить его работать:

callback = callback || (() => {}) 
+5

Что такое приоритет? –

2

Если вы планируете использовать ||, чтобы обеспечить значение по умолчанию для параметра обратного вызова функции, просто написать просто

function myfunc(callback =() => { }) { 
    callback("Hi 1252748"); 
} 

Никаких дополнительных парадов не требуется.

+0

Спасибо! Я считал это, но, честно говоря, я считаю, что параметр по умолчанию для функции слишком запутанный. На самом деле, мне даже не очень нравится все это. Это слишком много происходит в списке аргументов. – 1252748

+0

Конечно, но он имеет дело с проблемой сказать логический аргумент со значением по умолчанию, который не может быть легко обработан с помощью '||' идиомы. Лично я ** люблю ** аргументы по умолчанию и постоянно их использую. –

+0

'' логический аргумент с дефолтом, который не может быть легко обработан || idiom "' Можете ли вы объяснить, что вы имеете в виду? Как '' 'нелегко обрабатывать логические значения? – 1252748

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