Możesz przekazać wszystkie opcjonalne argumenty w obiekcie jako pierwszy argument. Drugim argumentem jest twój oddzwonienie.Teraz można przyjąć dowolną liczbę argumentów, jak chcesz w swoim pierwszym obiektem argumentu, i sprawiają, że opcja tak:
function my_func(op, cb) {
var options = (typeof arguments[0] !== "function")? arguments[0] : {},
callback = (typeof arguments[0] !== "function")? arguments[1] : arguments[0];
console.log(options);
console.log(callback);
}
Jeśli nazwać bez przejazdu argument opcji, będzie ona domyślnie pusty obiektu:
my_func(function() {});
=> options: {}
=> callback: function() {}
Jeśli zadzwonisz go z argumentem opcji można uzyskać wszystkie swoje params:
my_func({param1: 'param1', param2: 'param2'}, function() {});
=> options: {param1: "param1", param2: "param2"}
=> callback: function() {}
Może to oczywiście być manipulowane, aby pracować z większą ilością argumentów niż dwa, ale dostać more współpracowników nfusing. Jeśli możesz po prostu użyć obiektu jako pierwszego argumentu, możesz przekazać nieograniczoną liczbę argumentów za pomocą tego obiektu. Jeśli absolutnie potrzebujesz więcej argumentów opcjonalnych (np. My_func (arg1, arg2, arg3, ..., arg10, fn)), sugerowałbym użycie biblioteki takiej jak ArgueJS. Nie używałem go osobiście, ale wygląda obiecująco.
undefined jest właściwością globalną o stałej wartości, dlatego nie trzeba jej podawać. W przestarzałych przeglądarkach można przypadkowo ustawić dowolną wartość, ale nie jest tak w przypadku współczesnych przeglądarek. – andreszs
@Andrew: 'typeof' zawsze zwraca ciąg znaków. Alternatywnie, 'if (options === undefined)' również by działało. Ale jak już powiedziałeś, możliwe jest przesłonięcie "undefined" w starszych przeglądarkach, więc nadal powszechną praktyką (jak sądzę) jest nie używanie bezpośrednio 'undefined' (chyba że zdefiniowałeś gdzieś jawnie). –
nie porównuj ciągów z '===', nie są one konieczne dla tego samego obiektu, jeśli mają taką samą zawartość. – inetphantom