2015-09-02 3 views
17

я определил функции, как:Имена параметров с ES6?

function call_api(url, callback, query = {}, body = {}) 

Я ожидал, что синтаксис, где я могу предоставить тело и пропустить запрос:

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2}) 

Но я должен использовать этот обходной путь:

call_api('/api/clients/new', function(x){console.log(x)}, {}, {1:2}) 

Даже если я предоставляю body=, он появляется как параметр query. Я использую Babel с Webpack. Я пробовал синтаксис в консоли Chrome и в источнике Webpack.

Является ли такой синтаксис поддерживаемым ES6? Как это работает?

+0

Отличная статья по вашим опциям: http://www.2ality.com/2011/11/keyword-parameters.html – CodingIntrigue

+5

Значения по умолчанию! = Named arguments –

ответ

17

Я рекомендую вам обойти это с переходом объекта и с помощью уничтожения того объектов:

function callApi({url, callback, query = {}, body = {}}) 

И затем назовите это как:

callAPI({url: "/api/..", callback: (x => console.log(x)), body: {a:2}}) 

Это даст вам синтаксис, аналогичный тому, который вы хотите.

Именованные аргументы были рассмотрены и отклонены для JavaScript, в отличие от других языков, таких как C# и Python, которые ими занимаются. Here is a recent discussion about it из списка рассылки.

+0

Это очень больной человек! – marcusshep

1

Как показано на this site, значения по умолчанию предназначены только для параметров, для которых требуется значение по умолчанию (например, параметр параметров), но не для параметров пропуска.

То, что вы пытаетесь сделать, это

// function definition 
function hi(a,b,c,d) 

// function call 
hi(a,b,d) 

ES6 по-прежнему будет думать, что ваш «d», это определяется с, независимо от значения по умолчанию.
Нет, у ES6 такой синтаксис нет.

2

Вы не можете указать, какой параметр вы назначили в своем вызове.

call_api('/api/clients/new', function(x){console.log(x)}, body={1:2})

эквивалентно установке переменной с именем тела за пределами функции, а затем передавая ее значение в точке параметра запроса.

Вы можете использовать деструктуризацию, чтобы достичь того, чего хотите.

function call_api(url, callback, {query = {}, body = {}} = {})

Тогда при вызове вы могли бы сделать это

call_api('/api/clients/new', function(x){console.log(x)}, {body:{1:2}})

+0

, который, похоже, не работает, если вы вызываете свою функцию без третий аргумент вообще ... однако ... 'function call_api (url, callback, {query = {}, body = {}} = {})' does –

+0

Ой, забыл добавить это. Вот что я быстро набираю код в текстовое поле. Я обновлю ответ. – Jonathan

1

Видя, что значение параметра по умолчанию используется только, когда параметр не определен, единственный способ «пропустить» параметр и возвращаться к значению по умолчанию будет отправить undefined в это место:

call_api('/api/clients/new', function(x){console.log(x)}, undefined, {1:2}) 

Пример: Babel REPL

значение query внутри функции будет {} (или как вы установите значение по умолчанию для) в этом случае.

Это было бы похоже на what Visual Basic does, если вы хотите использовать значение параметра по умолчанию, передав пустое значение. (например, sub name(argument 1, , , argument 4))

В противном случае, если вы хотите поддерживать именованные параметры, лучшим компромиссом будет ответ, предоставленный @Benjamin Gruenbaum.


Update: Вы могли бы найти this article provides an option using the arguments keyword, или еще лучше, вы могли бы iterate over the ES6 ...rest parameters collection имитировать в JavaScript, в overloaded function.

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