2015-09-02 25 views
17

tôi đã xác định một chức năng như:Tên tham số với ES6?

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

tôi mong đợi một cú pháp nơi tôi có thể cung cấp cho cơ thể và bỏ qua truy vấn:

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

Nhưng tôi phải sử dụng workaround này:

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

Ngay cả khi tôi cung cấp body=, nó xuất hiện như thông số query. Tôi sử dụng Babel với Webpack. Tôi đã thử cú pháp trong bảng điều khiển Chrome và trong nguồn Webpack.

Cú pháp này có được ES6 hỗ trợ không? Làm thế nào nó hoạt động?

+0

Bài viết tuyệt vời về các tùy chọn của bạn: http://www.2ality.com/2011/11/keyword-parameters.html – CodingIntrigue

+5

Giá trị mặc định! = Đối số được đặt tên –

Trả lời

17

tôi khuyên bạn nên làm việc xung quanh này với đi qua một đối tượng và sử dụng destructuring cho các đối tượng:

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

Và sau đó gọi nó là:

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

Điều gì sẽ cung cấp cho bạn cú pháp tương tự như cú pháp bạn muốn.

Đối số được đặt tên đã được xem xét và bị từ chối đối với JavaScript, không giống như các ngôn ngữ khác như C# và Python thể thao chúng. Here is a recent discussion about it từ danh sách gửi thư ngôn ngữ.

+0

người đàn ông khá ốm yếu đó! – marcusshep

1

Như được hiển thị trên this site, giá trị mặc định chỉ dành cho các tham số cần giá trị mặc định (như tham số tùy chọn), nhưng không cho tham số 'bỏ qua'.

Những gì bạn đang cố gắng làm là

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

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

ES6 vẫn sẽ nghĩ rằng 'd' của bạn, là định nghĩa c, bất kể giá trị mặc định của bạn.
Vì vậy không, ES6 không có cú pháp như vậy.

2

Bạn không thể chỉ định tham số nào bạn gán cho cuộc gọi của mình.

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

là tương đương với thiết lập một cơ thể biến có tên bên ngoài của hàm và sau đó đi qua giá trị của nó trong vị trí tham số truy vấn của.

Bạn có thể sử dụng tính hủy diệt để đạt được những gì bạn muốn.

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

Sau đó, trong cuộc gọi của bạn, bạn sẽ làm điều này

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

+0

dường như không hoạt động nếu bạn gọi hàm của mình mà không cần đối số thứ ba ở tất cả ... tuy nhiên ... 'function call_api (url, gọi lại, {query = {}, body = {}} = {})' không –

+0

Rất tiếc, quên thêm điều đó. Đó là những gì tôi nhận được gõ mã một cách nhanh chóng vào một hộp văn bản. Tôi sẽ cập nhật câu trả lời. – Jonathan

1

Thấy giá trị tham số mặc định chỉ được sử dụng khi các tham số là undefined, cách duy nhất để "bỏ qua" một tham số và rơi trở lại để mặc định sẽ được gửi undefined trong đó diễn ra:

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

Ví dụ: Babel REPL

giá trị của query bên trong hàm sẽ {} (hoặc bất cứ điều gì bạn thiết lập mặc định để) trong trường hợp này.

Điều này sẽ hơi giống với what Visual Basic does khi bạn muốn sử dụng giá trị thông số mặc định bằng cách chuyển giá trị trống. (ví dụ: sub name(argument 1, , , argument 4))

Nếu không, nếu bạn muốn hỗ trợ các thông số được đặt tên, thỏa hiệp tốt nhất sẽ là câu trả lời được cung cấp bởi @Benjamin Gruenbaum.


Cập nhật: Bạn có thể thấy this article provides an option using the arguments keyword, hoặc tốt hơn nữa, bạn có thể iterate over the ES6 ...rest parameters collection để mô phỏng một overloaded function trong Javascript.

Các vấn đề liên quan