2010-02-09 33 views
22

Câu hỏi: Cách thích hợp để xác định hàm trong JavaScript có các tham số tùy chọn là gì?Trong JavaScript, làm thế nào tôi có thể tạo một hàm với tham số tùy chọn?

Ví dụ:

function myFunc(optionVar1) { 
    if(optionVar1 == undefined) { 
     ... 
    } else { 
     ... 
    } 
} 

myFunc('10'); // valid function call 
myFunc();  // also a valid function call 

Có thích hợp để sử dụng một dấu ? như Ruby trong phần khai báo hàm như vậy để biểu thị các thông số tùy chọn:

function myFunc(optionVar1?) {...} // <--- notice the ? mark 
+0

Tôi đã cập nhật câu trả lời của tôi dưới đây, nhưng câu trả lời ngắn gọn là không, dấu hỏi không phải là một ký tự cho phép cho một tên biến. – Damovisa

Trả lời

2

Câu trả lời google đầu tiên tôi phát hiện ra:

http://www.tipstrs.com/tip/354/Using-optional-parameters-in-Javascript-functions (liên kết bị hỏng)

Tôi chưa thấy bất kỳ trường hợp nào mà dấu chấm hỏi được sử dụng để cảnh báo người gọi đến tham số tùy chọn. Trong khi nó được thực hiện trong các ngôn ngữ khác, tôi không nghĩ rằng nó là cần thiết trong javascript.

Thực tế, it seems that you can't use a question mark in the variable name. Chỉ chữ cái, số, $ và _.

+0

Bài viết không giúp được gì. – SeanD

+0

Xin lỗi, tôi đã cập nhật câu trả lời của mình. – Damovisa

+0

Thật đáng tiếc. Việc khai báo đối số nào cho phép biểu thị tham số nào là không cần thiết. – SeanD

53

Không có cú pháp trong Javascript chỉ định rằng tham số là tùy chọn (hoặc bắt buộc). Tất cả các tham số đều là tùy chọn. Nếu họ không được chỉ định họ đang undefined, do đó bạn cần phải kiểm tra điều đó. Ví dụ, chức năng này sẽ có hiệu lực tạo ra một giá trị mặc định là 10 cho tham số:

function myfunc(someParam) { 
    if (someParam === undefined) { 
    someParam = 10; 
    } 
    ... 
} 

Ngoài ra bạn có thể truy cập vào các thông số lập trình bằng cách sử dụng arguments tài sản.

Cuối cùng, nếu bạn có nhiều hơn 3-4 thông số, bạn nên sử dụng đối tượng ẩn danh thay thế.

+1

Điều này có thể được đơn giản hóa trong hàm ES6 'myfunc (someParam = 10) {Tất cả mã ...}' – Tim

0

Chỉ cần không xác định hàm với bất kỳ tham số nào và truy nhập mảng đối số đặc biệt từ bên trong hàm mà bạn muốn tham số tùy chọn. Ví dụ bên dưới.

<HTML> 
<HEAD> 
<SCRIPT Language="JavaScript"> 
function foo() { 
    var argv = foo.arguments; 
    var argc = argv.length; 
    for (var i = 0; i < argc; i++) { 
    alert("Argument " + i + " = " + argv[i]); 
    } 
} 
</SCRIPT> 
</HEAD> 
<BODY onload="foo('hello', 'world');"> 
</BODY> 
</HTML> 
+0

Điều này không ' t giúp mọi người biết những thông số nào nên được bao gồm. Có vẻ kludgy – SeanD

+0

không có gì là một bình luận chức năng tốt đẹp không thể xử lý: p – James

7

Thực tế, tất cả các tham số đều tùy chọn trong các hàm JS. Không có cảnh báo hoặc lỗi nếu bạn bỏ qua một tham số.

Bạn có thể đặt giá trị mặc định như

function throw_cat(dist){ 
    dist = typeof dist=='undefined' ? 20 : dist; 
    //OR 
    dist = dist || 20; //this will assign it to 20 if you pass 0 or another 'falsy' value, though. May be good if you expect a string. String '0' stays, '' or null assigns the default 
    //etc... 
    } 
+1

'typeof' trả về một String. Sử dụng 'typeof dist === 'undefined'', hoặc, sở thích của tôi, chỉ' dist === undefined'. – bobince

+0

Cảm ơn, tôi có một chút không rõ ràng về điều đó. Trong một số ngữ cảnh (tức là bên ngoài một hàm), làm 'if (randomvar == undefined)' tạo ra một lỗi - 'ReferenceError: randomvar không được định nghĩa' vì vậy tôi đi với typeof. Tôi sẽ thêm dấu ngoặc kép. Liên kết – JAL

1

Một số nguồn tin sẽ cho bạn biết để bỏ qua các thông số hoàn toàn và thay vào đó tận dụng các mảng đối số. Điều này cho phép bạn lấy bất kỳ đầu vào nào được cung cấp cho hàm của bạn và bạn có thể quyết định cách phản hồi các đối số được truyền cho hàm của bạn như bạn thấy phù hợp.

Bạn có thể đọc thêm về nó ở đây: http://www.devguru.org/technologies/ecmascript/quickref/arguments.html

+1

bị hỏng ... –

1

cletus và Damovisa đã gợi ý tốt.Tôi cũng muốn nói thêm rằng một số (như bản thân mình) có thể thích một ký hiệu như thế này:

function foo(/*bar*/) { 
    if (arguments.length == 1) { 
     var bar = arguments[0]; 
     ... 
    } 
} 

này phục vụ tài liệu để các nhà phát triển của cơ sở mã của bạn mà lập luận là không bắt buộc và cũng có tài liệu tên, nhưng nó cũng ngăn ngừa sự lập luận hiển thị trong tên hàm trong một trình gỡ lỗi (ví dụ sẽ hiển thị như foo() hơn foo (optional_argument). Nếu không, phát triển những người đang tiêu thụ các API có thể giả định rằng nó đã được yêu cầu.

Chỉnh sửa: Điều này đặc biệt hữu ích cho các đối số tùy chọn được dự định sẽ được sử dụng trong nội bộ.

0

Is it proper to use a ? mark like Ruby in the function declaration

Không, không có cách nào dựa trên ngôn ngữ biểu thị tùy chọn arg. Tôi chắc chắn rằng nó có giá trị chỉ trong một chú thích, mặc dù:

function myFunc(var1, var2 /* optional */, var3 /* optional */) { 
    if (var2===undefined) ... 

(Lưu ý triple-bằng để thử nghiệm bình đẳng chính xác Nếu một trôi qua null giá trị cũng sẽ phù hợp với Bạn thường muốn === cho hầu hết các so sánh trong JS, như.. những đôi bình đẳng được undesirably yếu, đánh máy)

Đối với khi bạn đã có một số không xác định các đối số tùy chọn, bạn thường bỏ qua chúng từ báo cáo kết quả hoạt động, và một lần nữa một lời nhận xét lịch sự:.

function myFunc(var1 /* , optional var2..varN */) { 
    for (var i= 1; i<arguments.length; i++) ... 
3

Đầu tiên, tất cả những người viết JavaScript, hãy tự làm một việc và trải qua Learning Advanced JavaScript từ John Resig.

function myFunc(arg1, arg2 /* varargs... */) { 
    var optional = Array.prototype.slice.call(arguments, 2); 

Mọi tham số cho hàm là "tùy chọn", ngay cả những thông số bạn khai báo trong danh sách tham số của khai báo hàm.

Chỉ cần xem xét documenting chúng tốt.

2

Bạn có thể sử dụng chú thích như {Object =} hoặc {number =} trong phần bình luận khi sử dụng một Doclet:

 
/** 
* @param {object=}xyz 
*/ 

IDE hiện đại biết để nhận ra chú thích cho JavaScript và cho bạn thấy dấu hiệu về các vấn đề tiềm năng trong mã của bạn.

Ví dụ:

/** 
* 
* @param query 
* @param callback 
* @param {number=} ttl optional time-to-leave 
*/ 
loadByJSONP:function loadByJSONP(query, callback, ttl) { 
    ...do some work 
} 

Trong ví dụ 'ttl' này là không bắt buộc. chú thích {number =} chỉ ra cho IDE rằng tham số này là tùy chọn. Theo đó, khi bạn gọi hàm này chỉ với hai tham số, bạn sẽ không nhận được cảnh báo.

Chú thích cũng có thể được sử dụng để chỉ định loại mong đợi. điều này làm cho mã của bạn tốt hơn và ít bị lỗi hơn. Dưới đây là liên kết cho các chú thích:

https://developers.google.com/closure/compiler/docs/js-for-compiler

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