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) funkcjiString
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