Przejdź do treści

Dynamiczne tworzenie funkcji w JavaScript - new Function

Jak napisać program, który pozwoli dynamicznie utworzyć funkcję, na podstawie kodu wprowadzonego przez użytkownika? Jak sprawdzić, ile argumentów przyjmuje funkcja?

new Function

new Function()
new Function(body)
new Function(p1, p2... pn, body)
Parametry:
String body - ciało (kod źródłowy) funkcji
String p1, String p2... String pn - lista nazw argumentów funkcji; możliwe jest również łączenie kilku nazw argumentów w jednej zmiennej tekstowej rozdzielając je przecinkami - dlatego konstrukcja: "p1", "p2", "p3", "p4" jest równoważna: "p1,p2, p3", "p4"
Wartość:
Function - nowa instancja funkcji
Wyjątki:
SyntaxError - ciało funkcji albo lista nazw argumentów zawiera błąd składni

Działa identycznie jak konstrukcja Function(...), tzn. definiuje nową funkcję, którą później w programie możemy wywoływać.

Tego typu zapis jest jednak rzadko spotykany w rzeczywistych aplikacjach. Częściej stosuje się konstrukcję funkcji anonimowej.

Zapis z użyciem operatora new może być przydatny, jeżeli chcemy utworzyć funkcję na podstawie danych uzyskanych dopiero po uruchomieniu programu. Możemy np. utworzyć aplikację, która pozwoli użytkownikowi samodzielnie definiować funkcje. Możemy również pobrać kod z zewnętrznego źródła, który następnie zostanie zamieniony na funkcje w naszym programie.

Definiowanie funkcji z użyciem operatora new działa jak wywołanie funkcji eval - jest mało wydajnym sposobem uruchamiania kodu. Ponadto może być niebezpieczne dla aplikacji, ponieważ kod pobrany z zewnętrznego źródła - w tym od użytkownika - może zawierać złośliwe fragmenty, które negatywnie wpłyną na działanie aplikacji lub wykradną z niej jakieś sekretne dane.

Przykład new Function

var f = new Function();
f();                               // undefined
 
f = new Function("return 1");
f();                               // 1
 
f = new Function("a", "b", "return a + b");
f(1, 2);                           // 3
 
f = new Function("a, b", "c", "return (a + b) * c");
f(1, 2, 3);                        // 9
 
// Funkcja anonimowa:
f = function (a, b, c) {
    return (a + b) * c;
};
f(1, 2, 3);                        // 9
 
new Function("{");                 // SyntaxError
new Function("a + b", "return 1"); // SyntaxError

length

O.length
Parametry:
Function O - instancja funkcji
Wartość:
Number - liczba oczekiwanych argumentów funkcji

Zawiera wartość całkowitą wskazującą, ile argumentów oczekuje funkcja przy jej wywołaniu. Jednakże każdą funkcję można wywołać z inną liczbą argumentów, niż ona oczekuje. Wtedy niepodane argumenty przyjmują wartość undefined. Od konkretnej funkcji zależy, w jaki sposób obsłuży taką sytuację.

Tej wartości nie można zmienić. Ponadto jest ona niedostępna w pętli for-in.

Przykład

var f = function (a, b) {
    return a + b;
};
 
f.length;   // 2
f.length = 1;
f.length;   // 2
f();        // NaN
f(1, 2, 3); // 3

Komentarze

Zobacz więcej komentarzy

Facebook