Mam kawałek kodu javascript, którego po prostu nie rozumiem:
function dmy(d) {
function pad2(n) {
return (n < 10) ? '0' + n : n;
}
return pad2(d.getUTCDate()) + '/' +
pad2(d.getUTCMonth() + 1) + '/' +
d.getUTCFullYear();
}
function outerFunc(base) {
var punc = "!";
//inner function
function returnString(ext) {
return base + ext + punc;
}
return returnString;
}
Jak można zdefiniować funkcję w ramach innej funkcji? Czy możemy wywołać pad2 () spoza funkcji my ()?
Proszę, rzuć na to trochę światła. Dzięki
javascript
nested-function
Tomasz
źródło
źródło
Odpowiedzi:
Funkcje to inny typ zmiennych w JavaScript (oczywiście z pewnymi niuansami). Utworzenie funkcji w ramach innej funkcji zmienia zakres funkcji w taki sam sposób, jak zmieniałby zakres zmiennej. Jest to szczególnie ważne w przypadku użycia z zamknięciami w celu zmniejszenia całkowitego zanieczyszczenia globalnej przestrzeni nazw.
Funkcje zdefiniowane w innej funkcji nie będą dostępne poza funkcją, chyba że zostaną dołączone do obiektu, który jest dostępny poza funkcją:
function foo(doBar) { function bar() { console.log( 'bar' ); } function baz() { console.log( 'baz' ); } window.baz = baz; if ( doBar ) bar(); }
W tym przykładzie funkcja baz będzie dostępna do użycia po uruchomieniu
foo
funkcji, ponieważ została nadpisanawindow.baz
. Funkcja paska nie będzie dostępna dla żadnego kontekstu innego niż zakresy zawarte wfoo
funkcji.jako inny przykład:
function Fizz(qux) { this.buzz = function(){ console.log( qux ); }; }
Fizz
Funkcja została zaprojektowana jako konstruktor tak, że po uruchomieniu, przypisuje siębuzz
funkcję do nowo utworzonego obiektu.źródło
Nazywa się to zamknięciem .
Zasadniczo funkcja zdefiniowana w innej funkcji jest dostępna tylko w ramach tej funkcji. Ale może zostać przekazany jako wynik, a następnie ten wynik może zostać wywołany.
To bardzo potężna funkcja. Więcej wyjaśnień można znaleźć tutaj:
javascript_closures_for_dummies.html kopia lustrzana na Archive.org
źródło
function x() {}
jest równoważny (lub bardzo podobny) do
var x = function() {}
chyba że się mylę.
Więc nie dzieje się nic zabawnego.
źródło
Tworzenie instancji funkcji jest dozwolone wewnątrz i na zewnątrz funkcji. Wewnątrz tych funkcji, podobnie jak zmienne, funkcje zagnieżdżone są lokalne i dlatego nie można ich uzyskać z zewnętrznego zakresu.
function foo() { function bar() { return 1; } return bar(); }
foo
manipulujebar
w sobie.bar
nie można dotknąć z zakresu zewnętrznego, chyba że jest zdefiniowany w zakresie zewnętrznym.Więc to nie zadziała:
function foo() { function bar() { return 1; } } bar(); // throws error: bar is not defined
źródło
Kiedy deklarujesz funkcję w funkcji, funkcje wewnętrzne są dostępne tylko w zakresie, w którym zostały zadeklarowane, lub w twoim przypadku
pad2
można je wywołać tylko wdmy
zakresie.Wszystkie istniejące zmienne
dmy
są widoczne wpad2
, ale nie dzieje się na odwrót: Dźródło
Posiadanie funkcji wewnątrz funkcji jest całkowicie normalne w JavaScript (i wielu językach).
Poświęć trochę czasu na naukę języka, nie używaj go, ponieważ jest podobny do tego, co już znasz. Proponuję obejrzeć serię prezentacji YUI Douglasa Crockforda na temat Javascript, ze szczególnym uwzględnieniem Act III: Function the Ultimate (link do pobrania wideo, slajdów i transkrypcji)
źródło
function foo() { function bar() { return 1; } } bar();
Wystąpi błąd. Ponieważ
bar
jest zdefiniowany wewnątrzfoo
,bar
będzie dostępny tylko w środkufoo
.Aby go użyć
bar
, musisz uruchomić go w środkufoo
.function foo() { function bar() { return 1; } bar(); }
źródło