Przejdź do treści

Alternatywne sposoby definiowania funkcji w JavaScript - Function

Jakie są alternatywne sposoby definiowania funkcji?

Tworzenie funkcji po uruchomieniu programu - Function

Jak utworzyć funkcję już po uruchomieniu programu?

Function()
Function(body)
Function(p1, p2... pn, body)

Działa identycznie jak konstrukcja new Function(...).

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

Wartość length funkcji w JavaScript - length

Czy Function.length zawiera tę samą wartość co Function.prototype.length?

Function.length
Wartość:
Number - liczba 1

Ta wartość zawsze wynosi 1. Nie można jej zmienić. Jest niedostępna w pętli for-in.

Przykład Function.length

Function.length;       // 1
Function.length = 2;
Function.length;       // 1
Object.keys(Function); // []
Facebook