funkcje

funkcje

wszystkie działają w przybliżeniu tak samo, z kilkoma subtelnymi różnicami:

istnieje rozróżnienie między nazwą funkcji a zmienną, do której przypisana jest funkcja. Nazwa funkcji nie może zostać zmieniona, natomiast zmienna, do której przypisana jest funkcja, może zostać ponownie przypisana. Nazwa funkcji może być używana tylko w obrębie jej ciała. Próba użycia jej poza ciałem funkcji powoduje błąd (lub undefined jeśli nazwa funkcji została wcześniej zadeklarowana przezvar)., Na przykład:

var y = function x() {};alert(x); // throws an error

nazwa funkcji pojawia się również, gdy funkcja jest serializowana za pomocą metody toString Function.

z drugiej strony, zmienna, do której przypisana jest funkcja, jest ograniczona tylko zakresem, który gwarantuje, że obejmie zakres, w którym funkcja jest zadeklarowana.

Jak pokazuje czwarty przykład, nazwa funkcji może różnić się od zmiennej, do której jest przypisana funkcja. Nie mają ze sobą żadnego związku. Deklaracja funkcji tworzy również zmienną o tej samej nazwie co nazwa funkcji., Tak więc, w przeciwieństwie do tych zdefiniowanych przez wyrażenia funkcji, funkcje zdefiniowane przez deklaracje funkcji mogą być dostępne po ich nazwie w zakresie, w którym zostały zdefiniowane:

funkcja zdefiniowana przez 'new Function' nie ma nazwy funkcji. Jednak w silniku JavaScript Spidermonkey serializowana forma funkcji pokazuje się tak, jakby miała nazwę „anonymous”. Na przykładalert(new Function()) wyjścia:

function anonymous() {}

ponieważ funkcja faktycznie nie ma nazwy,anonymous nie jest zmienną, do której można uzyskać dostęp w ramach funkcji., Na przykład, następujące działania spowodowałyby błąd:

var foo = new Function("alert(anonymous);");foo();

w przeciwieństwie do funkcji zdefiniowanych za pomocą wyrażeń funkcji lub konstruktora Function, funkcja zdefiniowana za pomocą deklaracji funkcji może być użyta przed samą deklaracją funkcji. Na przykład:

foo(); // alerts FOO!function foo() { alert('FOO!');}

funkcja zdefiniowana za pomocą wyrażenia funkcji lub deklaracji funkcji dziedziczy bieżący zakres. Oznacza to, że funkcja tworzy zamknięcie., Z drugiej strony, funkcja zdefiniowana przez konstruktor Function nie dziedziczy żadnego zakresu poza zakresem globalnym (który dziedziczą wszystkie funkcje).

funkcje zdefiniowane przez wyrażenia funkcji i deklaracje funkcji są przetwarzane tylko raz, podczas gdy te zdefiniowane przez konstruktor Function nie są. Oznacza to, że łańcuch funkcji przekazywany do konstruktora Function musi być przetwarzany za każdym razem, gdy konstruktor jest wywoływany., Chociaż wyrażenie funkcji tworzy Zamknięcie Za każdym razem, ciało funkcji nie jest reparsowane, więc wyrażenia funkcji są nadal szybsze niż ” new Function(...)„. Dlatego konstruktora Function należy unikać, gdy jest to możliwe.

należy jednak zauważyć, że wyrażenia funkcji i deklaracje funkcji zagnieżdżone w funkcji generowanej przez parsowanie ciągu Function constructor nie są przetwarzane wielokrotnie. Na przykład:

deklaracja funkcji jest bardzo łatwo (i często nieumyślnie) przekształcana w wyrażenie funkcji., Deklaracja funkcji przestaje być taka, gdy:

  • staje się częścią wyrażenia
  • nie jest już „elementem źródłowym” funkcji ani samego skryptu. „Element źródłowy” jest zagnieżdżoną Instrukcją w skrypcie lub ciele funkcji:

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *