Obiekt Function ECMAScript (klasa)
- Poprzednia strona Obiekt arguments
- Następna strona Kapsuła (closure)
ECMAScript 的函数实际上是功能完整的对象。
Function 对象(类)
ECMAScript 最吸引人的可能是函数实际上是功能完整的对象。
Function 类可以表示开发者定义的任何函数。
语法用于直接创建 Function 类的函数如下:
var function_name = new function()arg1, arg2, ... , argN, function_body)
W powyższej formie, każdy arg wszystkie są parametrami, ostatnim parametrem jest ciało funkcji (kod do wykonania). Te parametry muszą być ciągami znaków.
Pamiętasz tę funkcję?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
może być również zdefiniowana w następujący sposób:
var sayHi = new Function("sName", "sMessage", "alert("Hello " + sName + sMessage)");
Choć z powodu ciągów znaków, forma ta może być nieco trudna do napisania, ale pomaga zrozumieć, że funkcje to po prostu typ odniesień, które zachowują się tak samo jak funkcje utworzone za pomocą klasy Function.
Proszę spojrzeć na poniższy przykład:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //Wyświetla "20"
Jak już wiesz, druga funkcja nadpisała pierwszą funkcję, tak że doAdd(10) wyświetla "20", zamiast "30".
Jeśli skopiujemy ten blok kodu w następujący sposób, koncept ten staje się jasny:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
Proszę zauważyć, że wartość doAdd została zmieniona na wskaźnik do innego obiektu. Nazwa funkcji to po prostu odniesienie do obiektu funkcji, które zachowuje się jak inne obiekty. Nawet można mieć dwie zmienne wskazujące na tę samą funkcję:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //Wyświetla "20" alsodoAdd(10); //Wyświetla "20"
W tym miejscu zmienna doAdd została zdefiniowana jako funkcja, a potem alsodoAdd jako wskaźnik wskazujący na tę samą funkcję. Obie zmienne mogą wykonywać kod funkcji i wyświetlać ten sam wynik - "20". Dlatego jeśli nazwa funkcji to po prostu wskaźnik do funkcji, czy można przekazać funkcję jako argument do innej funkcji? Odpowiedź brzmi: tak!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //wyświetla "20"
W powyższym przykładzie callAnotherFunc() ma dwa parametry - funkcję do wywołania i parametry przekazywane do tej funkcji. To kod przekazuje do callAnotherFunc() funkcję doAdd(), parametrem jest 10, i wyświetla "20".
Uwaga:Chociaż można używać konstruktora Function do tworzenia funkcji, lepiej tego nie robić, ponieważ definiowanie funkcji w ten sposób jest znacznie wolniejsze niż tradycyjne podejście. Jednak wszystkie funkcje powinny być traktowane jako instancje klasy Function.
Atrybut length obiektu Function
Jak już wspomniano, funkcje należą do typów odniesień, więc mają również atrybuty i metody.
Atrybut length zdefiniowany przez ECMAScript określa liczbę oczekiwanych parametrów funkcji. Na przykład:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //wyświetla "1" alert(sayHi.length); //wyświetla "0"
Funkcja doAdd() zdefiniowała jeden parametr, więc jej length wynosi 1; funkcja sayHi() nie zdefiniowała parametrów, więc length wynosi 0.
Pamiętaj, że niezależnie od liczby zdefiniowanych parametrów, ECMAScript może przyjąć dowolną liczbę parametrów (maksymalnie 25), co zostało omówione w rozdziale "Podstawy funkcji". Atrybut length służy tylko do uproszczenia wyświetlania liczby oczekiwanych parametrów w domyślnych warunkach.
Metody obiektu Function
Obiekt Function ma również metody valueOf() i toString(), które są wspólnymi metodami dla wszystkich obiektów. Obie te metody zwracają kod źródłowy funkcji, co jest szczególnie przydatne podczas debugowania. Na przykład:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
Poniższy kod wyświetla tekst funkcji doAdd().Spróbuj sam!
- Poprzednia strona Obiekt arguments
- Następna strona Kapsuła (closure)