Można sobie z tą niedogodnością poradzić w całkiem prosty sposób i wiele osób tak to właśnie robi. Poniżej zamieszczam kawałek kodu.
var fn = function(a, b, c){ a = a || 25; b = b || [2, 5]; c = c || 'domyslny'; alert( 'liczba: ' + a + '\n' + 'tablica: ' + b + '\n' + 'string: ' + c ); }; fn(5, [1,2,3], 'test'); fn(5, [1,2,3]); fn(5); fn();
Działa całkiem nieźle. Co jednak jeśli wywołamy funkcję w poniższy sposób?
fn(0);
Funkcja wyświetla 25. Przecież wysłaliśmy 0 (zero). Dzieje się tak, ponieważ poniższa konstrukcja traktuje liczbę 0 jako wartość false, dlatego do zmiennej a przypisywana jest alternatywna wartość 25.
a = a || 25;
Skoro znamy już problemy wynikające z powyższych konstrukcji przejdźmy do rozwiązania problemu w inny, bardziej elegancki sposób.
Poniżej zamieszczam funkcję która pozwala ze zwykłej funkcji stworzyć funkcję przyjmującą domyślne parametry. Kod zawiera również funkcję testową oraz kilka jej wywołań.
Function.prototype.params = function(){ var that = this, arg = [].splice.apply(arguments, [0, arguments.length]); return function(){ return that.apply(this, [].splice.apply(arguments, [0]).concat( arg.slice(arguments.length) ) ); }; }; var test = function(a, b){ alert( a + '\n' + b ); }.params(11, 22); test(1, 2); test(1); test();
Stworzenie funkcji z domyślnymi parametrami jest teraz dziecinnie proste. Wystarczy zadeklarować dowolną funkcję a zaraz za nią wywołać naszą metodę z argumentami, które mają być domyślne.
Warto pamiętać o tym, że powyższe udogodnienie będzie spowalniać działanie skryptu. Każde wywołanie zwróconej funkcji powoduje wywołanie kilku dodatkowych instrukcji. Nadużywanie tego udogodnienia może okazać się nierozsądne, w szczególności w przypadku prostych, wielokrotnie powtarzanych funkcji.