{"id":1087,"date":"2026-02-20T10:08:02","date_gmt":"2026-02-20T09:08:02","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1087"},"modified":"2026-02-20T10:08:03","modified_gmt":"2026-02-20T09:08:03","slug":"funkcja-javascript-jako-podstawowy-mechanizm-organizacji-kodu-i-kontroli-przeplywu-wykonania","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/02\/20\/funkcja-javascript-jako-podstawowy-mechanizm-organizacji-kodu-i-kontroli-przeplywu-wykonania\/","title":{"rendered":"Funkcja JavaScript jako podstawowy mechanizm organizacji kodu i kontroli przep\u0142ywu wykonania"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Funkcja jest bytem, kt\u00f3ry \u0142\u0105czy kilka element\u00f3w: nazw\u0119 (opcjonaln\u0105), list\u0119 parametr\u00f3w wej\u015bciowych, cia\u0142o zawieraj\u0105ce instrukcje oraz opcjonaln\u0105 warto\u015b\u0107 zwracan\u0105. <strong>Funkcja JavaScript<\/strong> jest jednocze\u015bnie obiektem pierwszej klasy, co oznacza, \u017ce mo\u017ce by\u0107 przypisywana do zmiennych, przekazywana jako argument do innych funkcji oraz zwracana jako wynik wywo\u0142ania innej funkcji. Ten fakt wp\u0142ywa na spos\u00f3b projektowania kodu: funkcje nie s\u0105 tylko \u201eklockami\u201d wykonuj\u0105cymi procedury, ale elementami, kt\u00f3re mo\u017cna traktowa\u0107 jak dane.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li class=\"\"><a href=\"#przyklady-definicji-i-wywolan-funkcji-w-roznych-jezykach\">Przyk\u0142ady definicji i wywo\u0142a\u0144 funkcji w r\u00f3\u017cnych j\u0119zykach<\/a><\/li><li class=\"\"><a href=\"#funkcja-javascript-w-kontekscie-zakresow-zmiennych-domkniec-i-kontekstu-wywolania\">Funkcja JavaScript w kontek\u015bcie zakres\u00f3w zmiennych, domkni\u0119\u0107 i kontekstu wywo\u0142ania<\/a><ol><li class=\"\"><a href=\"#funkcja-java-script-przyklady-domkniec-i-zachowania-this\">Funkcja JavaScript: Przyk\u0142ady domkni\u0119\u0107 i zachowania this<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#funkcja-javascript-jako-obiekt-typy-funkcji-i-konsekwencje-projektowe-w-wiekszych-programach\">Funkcja JavaScript jako obiekt, typy funkcji i konsekwencje projektowe w wi\u0119kszych programach<\/a><\/li><li class=\"\"><a href=\"#funkcja-java-script-przyklady-funkcji-wyzszego-rzedu-i-roznych-form-zapisu\">Funkcja JavaScript: Przyk\u0142ady funkcji wy\u017cszego rz\u0119du i r\u00f3\u017cnych form zapisu<\/a><ol><li class=\"\"><a href=\"#krotkie-uwagi-praktyczne\">Kr\u00f3tkie uwagi praktyczne<\/a><\/li><li class=\"\"><a href=\"#zakonczenie\">Techniczne domkni\u0119cie notatek: funkcja jako narz\u0119dzie my\u015blenia o kodzie<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Wywo\u0142anie funkcji powoduje utworzenie nowej ramki stosu wywo\u0142a\u0144. Do ramki trafiaj\u0105 warto\u015bci argument\u00f3w, zmienne lokalne oraz kontekst wykonania. Po zako\u0144czeniu funkcji ramka jest usuwana, a sterowanie wraca do miejsca wywo\u0142ania. Ten mechanizm ma konsekwencje wydajno\u015bciowe i pami\u0119ciowe: g\u0142\u0119bokie zagnie\u017cd\u017cenia wywo\u0142a\u0144 lub rekurencja bez warunku stopu prowadz\u0105 do przepe\u0142nienia stosu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Parametry w JavaScript s\u0105 przekazywane przez warto\u015b\u0107, ale w przypadku obiekt\u00f3w i tablic \u201ewarto\u015bci\u0105\u201d jest referencja. Skutkiem jest mo\u017cliwo\u015b\u0107 modyfikacji obiektu wewn\u0105trz funkcji, co zmienia stan widoczny na zewn\u0105trz. Z punktu widzenia projektowania API funkcji trzeba \u015bwiadomie decydowa\u0107, czy funkcja ma mie\u0107 skutki uboczne (modyfikacja przekazanych struktur), czy ma by\u0107 czysto obliczeniowa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zwracanie warto\u015bci odbywa si\u0119 instrukcj\u0105 <code>return<\/code>. Brak <code>return<\/code> oznacza zwr\u00f3cenie warto\u015bci <code>undefined<\/code>. W praktyce cz\u0119sto prowadzi to do trudnych do wykrycia b\u0142\u0119d\u00f3w, gdy wywo\u0142uj\u0105cy kod zak\u0142ada istnienie wyniku.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"przyklady-definicji-i-wywolan-funkcji-w-roznych-jezykach\"><strong>Przyk\u0142ady definicji i wywo\u0142a\u0144 funkcji w r\u00f3\u017cnych j\u0119zykach<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad kodu<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\nint suma(int a, int b) {\\n return a + b;\\n}\\n\\nint main() {\\n int x = suma(2, 3);\\n return 0;\\n}\\n<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\nint suma(int a, int b) {\\n return a + b;\\n}\\n\\nint main() {\\n int x = suma(2, 3);\\n return 0;\\n}\\n<\/code><\/td><\/tr><tr><td>Python<\/td><td><code>python\\ndef suma(a, b):\\n return a + b\\n\\nx = suma(2, 3)\\n<\/code><\/td><\/tr><tr><td>JavaScript<\/td><td><code>javascript\\nfunction suma(a, b) {\\n return a + b;\\n}\\n\\nlet x = suma(2, 3);\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"funkcja-javascript-w-kontekscie-zakresow-zmiennych-domkniec-i-kontekstu-wywolania\">Funkcja JavaScript w kontek\u015bcie zakres\u00f3w zmiennych, domkni\u0119\u0107 i kontekstu wywo\u0142ania<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zakres zmiennych w JavaScript jest leksykalny. Oznacza to, \u017ce funkcja \u201ewidzi\u201d zmienne z miejsca, w kt\u00f3rym zosta\u0142a zdefiniowana, a nie z miejsca, w kt\u00f3rym zosta\u0142a wywo\u0142ana. To prowadzi do mechanizmu domkni\u0119\u0107 (closures). Domkni\u0119cie to funkcja wraz z zapami\u0119tanym otoczeniem zmiennych, kt\u00f3re by\u0142y dost\u0119pne w momencie jej definicji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Domkni\u0119cia s\u0105 wykorzystywane do enkapsulacji stanu. Zamiast trzyma\u0107 dane w zmiennych globalnych, mo\u017cna zamkn\u0105\u0107 je wewn\u0105trz funkcji fabrykuj\u0105cej inne funkcje. W ten spos\u00f3b powstaj\u0105 prywatne zmienne, niedost\u0119pne bezpo\u015brednio z zewn\u0105trz. Mechanizm ten jest cz\u0119sto u\u017cywany w bibliotekach oraz w kodzie aplikacji do budowy prostych modu\u0142\u00f3w bez u\u017cycia klas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kontekst <code>this<\/code> w JavaScript zale\u017cy od sposobu wywo\u0142ania funkcji. Dla funkcji wywo\u0142anej jako metoda obiektu <code>this<\/code> wskazuje na obiekt, do kt\u00f3rego nale\u017cy metoda. Dla funkcji wywo\u0142anej \u201elu\u017ano\u201d w trybie nie\u015bcis\u0142ym <code>this<\/code> wskazuje na obiekt globalny, a w trybie \u015bcis\u0142ym (<code>\"use strict\"<\/code>) ma warto\u015b\u0107 <code>undefined<\/code>. Strza\u0142kowe funkcje nie posiadaj\u0105 w\u0142asnego <code>this<\/code> i przejmuj\u0105 je z otoczenia leksykalnego, co upraszcza prac\u0119 z wywo\u0142aniami asynchronicznymi, ale zmienia semantyk\u0119 w por\u00f3wnaniu do klasycznych funkcji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Domkni\u0119cia i kontekst wywo\u0142ania s\u0105 \u015bci\u015ble powi\u0105zane z modelem wykonania kodu JavaScript, kt\u00f3ry w \u015brodowisku przegl\u0105darki jest oparty o p\u0119tl\u0119 zdarze\u0144, a implementacje silnik\u00f3w (np. SpiderMonkey w przegl\u0105darkach opartych na Gecko) zarz\u0105dzaj\u0105 kolejkami zada\u0144 i mikro-zada\u0144. Funkcje przekazywane jako callbacki zachowuj\u0105 swoje domkni\u0119cia, nawet je\u015bli s\u0105 wykonywane znacznie p\u00f3\u017aniej.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"funkcja-java-script-przyklady-domkniec-i-zachowania-this\"><strong>Funkcja JavaScript: Przyk\u0142ady domkni\u0119\u0107 i zachowania <code>this<\/code><\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad kodu<\/th><\/tr><\/thead><tbody><tr><td>JavaScript \u2013 domkni\u0119cie<\/td><td><code>javascript\\nfunction licznik() {\\n let x = 0;\\n return function() {\\n x = x + 1;\\n return x;\\n };\\n}\\n\\nlet inc = licznik();\\nlet a = inc();\\nlet b = inc();\\n<\/code><\/td><\/tr><tr><td>JavaScript \u2013 this<\/td><td><code>javascript\\nlet obj = {\\n x: 10,\\n f: function() {\\n return this.x;\\n }\\n};\\n\\nlet y = obj.f();\\n<\/code><\/td><\/tr><tr><td>Python \u2013 domkni\u0119cie<\/td><td><code>python\\ndef licznik():\\n x = 0\\n def inc():\\n nonlocal x\\n x = x + 1\\n return x\\n return inc\\n\\ninc = licznik()\\na = inc()\\nb = inc()\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"funkcja-javascript-jako-obiekt-typy-funkcji-i-konsekwencje-projektowe-w-wiekszych-programach\">Funkcja JavaScript jako obiekt, typy funkcji i konsekwencje projektowe w wi\u0119kszych programach<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja w JavaScript jest obiektem, co oznacza mo\u017cliwo\u015b\u0107 dodawania do niej w\u0142asnych w\u0142a\u015bciwo\u015bci, przekazywania jej jako warto\u015bci oraz dynamicznego tworzenia w czasie wykonania. Ten fakt upraszcza budow\u0119 funkcji wy\u017cszego rz\u0119du, czyli takich, kt\u00f3re przyjmuj\u0105 inne funkcje jako argumenty lub je zwracaj\u0105. W praktyce oznacza to mo\u017cliwo\u015b\u0107 implementowania mapowania, filtrowania czy redukcji zbior\u00f3w danych bez wprowadzania dodatkowych konstrukcji j\u0119zykowych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Istnieje kilka form zapisu funkcji: deklaracje funkcji, wyra\u017cenia funkcyjne oraz funkcje strza\u0142kowe. Deklaracje s\u0105 podnoszone (hoisting), co oznacza, \u017ce mo\u017cna je wywo\u0142ywa\u0107 przed miejscem definicji w kodzie \u017ar\u00f3d\u0142owym. Wyra\u017cenia funkcyjne s\u0105 traktowane jak przypisania do zmiennych i nie s\u0105 w pe\u0142ni podnoszone \u2013 dost\u0119p do nich przed inicjalizacj\u0105 ko\u0144czy si\u0119 b\u0142\u0119dem. Funkcje strza\u0142kowe maj\u0105 inny model <code>this<\/code> i brak w\u0142asnego <code>arguments<\/code>, co wp\u0142ywa na spos\u00f3b pisania funkcji og\u00f3lnego przeznaczenia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Z punktu widzenia architektury programu decyzja o u\u017cyciu funkcji jako no\u015bnika logiki zamiast klas czy struktur danych ma konsekwencje dla czytelno\u015bci i testowalno\u015bci. Funkcje czyste, pozbawione skutk\u00f3w ubocznych, \u0142atwiej testowa\u0107 jednostkowo i sk\u0142ada\u0107 w wi\u0119ksze algorytmy. Funkcje zale\u017cne od stanu zewn\u0119trznego (np. DOM w przegl\u0105darce) s\u0105 trudniejsze do izolowania w testach i wymagaj\u0105 dodatkowych mechanizm\u00f3w podstawiania zale\u017cno\u015bci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W kontek\u015bcie algorytmicznym funkcje pozwalaj\u0105 wyrazi\u0107 operacje rekurencyjne i iteracyjne w spos\u00f3b zbli\u017cony do zapisu matematycznego. Trzeba jednak bra\u0107 pod uwag\u0119 brak optymalizacji wywo\u0142a\u0144 ogonowych w wi\u0119kszo\u015bci \u015brodowisk JavaScript, co ogranicza praktyczne zastosowanie rekurencji dla du\u017cych danych wej\u015bciowych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"funkcja-java-script-przyklady-funkcji-wyzszego-rzedu-i-roznych-form-zapisu\"><strong>Funkcja JavaScript: Przyk\u0142ady funkcji wy\u017cszego rz\u0119du i r\u00f3\u017cnych form zapisu<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Przyk\u0142ad kodu<\/th><\/tr><\/thead><tbody><tr><td>JavaScript \u2013 funkcja wy\u017cszego rz\u0119du<\/td><td><code>javascript\\nfunction zastosuj(f, x) {\\n return f(x);\\n}\\n\\nfunction kwadrat(n) {\\n return n * n;\\n}\\n\\nlet y = zastosuj(kwadrat, 5);\\n<\/code><\/td><\/tr><tr><td>JavaScript \u2013 wyra\u017cenie funkcyjne<\/td><td><code>javascript\\nlet suma = function(a, b) {\\n return a + b;\\n};\\n\\nlet x = suma(1, 2);\\n<\/code><\/td><\/tr><tr><td>JavaScript \u2013 funkcja strza\u0142kowa<\/td><td><code>javascript\\nlet suma = (a, b) =&gt; {\\n return a + b;\\n};\\n\\nlet x = suma(1, 2);\\n<\/code><\/td><\/tr><tr><td>C \u2013 funkcja jako wska\u017anik<\/td><td><code>c\\nint kwadrat(int x) {\\n return x * x;\\n}\\n\\nint zastosuj(int (*f)(int), int x) {\\n return f(x);\\n}\\n\\nint y = zastosuj(kwadrat, 5);\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"krotkie-uwagi-praktyczne\">Kr\u00f3tkie uwagi praktyczne<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Problem<\/th><th>Opis<\/th><\/tr><\/thead><tbody><tr><td>Niejawny <code>undefined<\/code><\/td><td>Brak <code>return<\/code> powoduje zwr\u00f3cenie <code>undefined<\/code>, co \u0142atwo przeoczy\u0107 w z\u0142o\u017conych \u0142a\u0144cuchach wywo\u0142a\u0144.<\/td><\/tr><tr><td>Mutacja obiekt\u00f3w<\/td><td>Przekazywanie obiekt\u00f3w do funkcji mo\u017ce zmienia\u0107 ich stan poza funkcj\u0105, co utrudnia \u015bledzenie b\u0142\u0119d\u00f3w.<\/td><\/tr><tr><td><code>this<\/code> zale\u017cne od wywo\u0142ania<\/td><td>Ten sam kod funkcji mo\u017ce dzia\u0142a\u0107 inaczej w zale\u017cno\u015bci od kontekstu wywo\u0142ania.<\/td><\/tr><tr><td>Rekurencja<\/td><td>Brak optymalizacji ogonowej w praktyce ogranicza g\u0142\u0119boko\u015b\u0107 rekurencji.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zakonczenie\">Techniczne domkni\u0119cie notatek: funkcja jako narz\u0119dzie my\u015blenia o kodzie<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcje s\u0105 podstawowym mechanizmem porz\u0105dkowania logiki w JavaScript i innych j\u0119zykach, ale ich konkretna semantyka \u2013 zwi\u0105zana z zakresem zmiennych, kontekstem wywo\u0142ania i sposobem przekazywania danych \u2013 wymaga \u015bwiadomego projektowania, zw\u0142aszcza w wi\u0119kszych programach, gdzie drobne r\u00f3\u017cnice w zachowaniu funkcji przek\u0142adaj\u0105 si\u0119 na realne b\u0142\u0119dy i problemy utrzymaniowe.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Funkcja jest bytem, kt\u00f3ry \u0142\u0105czy kilka element\u00f3w: nazw\u0119 (opcjonaln\u0105), list\u0119 parametr\u00f3w wej\u015bciowych, cia\u0142o zawieraj\u0105ce instrukcje oraz opcjonaln\u0105 warto\u015b\u0107 zwracan\u0105. Funkcja JavaScript jest jednocze\u015bnie obiektem pierwszej klasy, co oznacza, \u017ce mo\u017ce by\u0107 przypisywana do zmiennych, przekazywana jako argument do innych funkcji oraz zwracana jako wynik wywo\u0142ania innej funkcji. Ten fakt wp\u0142ywa na spos\u00f3b projektowania kodu: funkcje nie s\u0105 tylko \u201eklockami\u201d wykonuj\u0105cymi procedury, ale elementami, kt\u00f3re mo\u017cna traktowa\u0107 jak dane. Wywo\u0142anie funkcji powoduje utworzenie nowej ramki stosu wywo\u0142a\u0144. Do ramki trafiaj\u0105 warto\u015bci argument\u00f3w, zmienne lokalne oraz kontekst wykonania. Po zako\u0144czeniu funkcji ramka jest usuwana, a sterowanie wraca do miejsca wywo\u0142ania. Ten mechanizm ma konsekwencje wydajno\u015bciowe i pami\u0119ciowe: g\u0142\u0119bokie zagnie\u017cd\u017cenia wywo\u0142a\u0144 lub rekurencja bez warunku stopu prowadz\u0105 do przepe\u0142nienia stosu. Parametry w JavaScript s\u0105 przekazywane przez warto\u015b\u0107, ale w przypadku obiekt\u00f3w i tablic \u201ewarto\u015bci\u0105\u201d jest referencja. Skutkiem jest mo\u017cliwo\u015b\u0107 modyfikacji obiektu wewn\u0105trz funkcji, co zmienia stan widoczny na zewn\u0105trz. Z punktu widzenia projektowania API funkcji trzeba \u015bwiadomie decydowa\u0107, czy funkcja ma mie\u0107 skutki uboczne (modyfikacja przekazanych struktur), czy ma by\u0107 czysto obliczeniowa. Zwracanie warto\u015bci odbywa si\u0119 instrukcj\u0105 return. Brak return oznacza zwr\u00f3cenie warto\u015bci undefined. W praktyce cz\u0119sto prowadzi to do trudnych do wykrycia b\u0142\u0119d\u00f3w, gdy wywo\u0142uj\u0105cy kod zak\u0142ada istnienie wyniku. Przyk\u0142ady definicji i wywo\u0142a\u0144 funkcji w r\u00f3\u017cnych j\u0119zykach J\u0119zyk Przyk\u0142ad kodu C c\\nint suma(int a, int b) {\\n return a + b;\\n}\\n\\nint main() {\\n int x = suma(2, 3);\\n return 0;\\n}\\n C++ cpp\\nint suma(int a, int b) {\\n return a + b;\\n}\\n\\nint main() {\\n int x = suma(2, 3);\\n return 0;\\n}\\n Python python\\ndef suma(a, b):\\n return a + b\\n\\nx = suma(2, 3)\\n JavaScript javascript\\nfunction suma(a, b) {\\n return a + b;\\n}\\n\\nlet x = suma(2, 3);\\n Funkcja JavaScript w kontek\u015bcie zakres\u00f3w zmiennych, domkni\u0119\u0107 i kontekstu wywo\u0142ania Zakres zmiennych w JavaScript jest leksykalny. Oznacza to, \u017ce funkcja \u201ewidzi\u201d zmienne z miejsca, w kt\u00f3rym zosta\u0142a zdefiniowana, a nie z miejsca, w kt\u00f3rym zosta\u0142a wywo\u0142ana. To prowadzi do mechanizmu domkni\u0119\u0107 (closures). Domkni\u0119cie to funkcja wraz z zapami\u0119tanym otoczeniem zmiennych, kt\u00f3re by\u0142y dost\u0119pne w momencie jej definicji. Domkni\u0119cia s\u0105 wykorzystywane do enkapsulacji stanu. Zamiast trzyma\u0107 dane w zmiennych globalnych, mo\u017cna zamkn\u0105\u0107 je wewn\u0105trz funkcji fabrykuj\u0105cej inne funkcje. W ten spos\u00f3b powstaj\u0105 prywatne zmienne, niedost\u0119pne bezpo\u015brednio z zewn\u0105trz. Mechanizm ten jest cz\u0119sto u\u017cywany w bibliotekach oraz w kodzie aplikacji do budowy prostych modu\u0142\u00f3w bez u\u017cycia klas. Kontekst this w JavaScript zale\u017cy od sposobu wywo\u0142ania funkcji. Dla funkcji wywo\u0142anej jako metoda obiektu this wskazuje na obiekt, do kt\u00f3rego nale\u017cy metoda. Dla funkcji wywo\u0142anej \u201elu\u017ano\u201d w trybie nie\u015bcis\u0142ym this wskazuje na obiekt globalny, a w trybie \u015bcis\u0142ym (&#8222;use strict&#8221;) ma warto\u015b\u0107 undefined. Strza\u0142kowe funkcje nie posiadaj\u0105 w\u0142asnego this i przejmuj\u0105 je z otoczenia leksykalnego, co upraszcza prac\u0119 z wywo\u0142aniami asynchronicznymi, ale zmienia semantyk\u0119 w por\u00f3wnaniu do klasycznych funkcji. Domkni\u0119cia i kontekst wywo\u0142ania s\u0105 \u015bci\u015ble powi\u0105zane z modelem wykonania kodu JavaScript, kt\u00f3ry w \u015brodowisku przegl\u0105darki jest oparty o p\u0119tl\u0119 zdarze\u0144, a implementacje silnik\u00f3w (np. SpiderMonkey w przegl\u0105darkach opartych na Gecko) zarz\u0105dzaj\u0105 kolejkami zada\u0144 i mikro-zada\u0144. Funkcje przekazywane jako callbacki zachowuj\u0105 swoje domkni\u0119cia, nawet je\u015bli s\u0105 wykonywane znacznie p\u00f3\u017aniej. Funkcja JavaScript: Przyk\u0142ady domkni\u0119\u0107 i zachowania this J\u0119zyk Przyk\u0142ad kodu JavaScript \u2013 domkni\u0119cie javascript\\nfunction licznik() {\\n let x = 0;\\n return function() {\\n x = x + 1;\\n return x;\\n };\\n}\\n\\nlet inc = licznik();\\nlet a = inc();\\nlet b = inc();\\n JavaScript \u2013 this javascript\\nlet obj = {\\n x: 10,\\n f: function() {\\n return this.x;\\n }\\n};\\n\\nlet y = obj.f();\\n Python \u2013 domkni\u0119cie python\\ndef licznik():\\n x = 0\\n def inc():\\n nonlocal x\\n x = x + 1\\n return x\\n return inc\\n\\ninc = licznik()\\na = inc()\\nb = inc()\\n Funkcja JavaScript jako obiekt, typy funkcji i konsekwencje projektowe w wi\u0119kszych programach Funkcja w JavaScript jest obiektem, co oznacza mo\u017cliwo\u015b\u0107 dodawania do niej w\u0142asnych w\u0142a\u015bciwo\u015bci, przekazywania jej jako warto\u015bci oraz dynamicznego tworzenia w czasie wykonania. Ten fakt upraszcza budow\u0119 funkcji wy\u017cszego rz\u0119du, czyli takich, kt\u00f3re przyjmuj\u0105 inne funkcje jako argumenty lub je zwracaj\u0105. W praktyce oznacza to mo\u017cliwo\u015b\u0107 implementowania mapowania, filtrowania czy redukcji zbior\u00f3w danych bez wprowadzania dodatkowych konstrukcji j\u0119zykowych. Istnieje kilka form zapisu funkcji: deklaracje funkcji, wyra\u017cenia funkcyjne oraz funkcje strza\u0142kowe. Deklaracje s\u0105 podnoszone (hoisting), co oznacza, \u017ce mo\u017cna je wywo\u0142ywa\u0107 przed miejscem definicji w kodzie \u017ar\u00f3d\u0142owym. Wyra\u017cenia funkcyjne s\u0105 traktowane jak przypisania do zmiennych i nie s\u0105 w pe\u0142ni podnoszone \u2013 dost\u0119p do nich przed inicjalizacj\u0105 ko\u0144czy si\u0119 b\u0142\u0119dem. Funkcje strza\u0142kowe maj\u0105 inny model this i brak w\u0142asnego arguments, co wp\u0142ywa na spos\u00f3b pisania funkcji og\u00f3lnego przeznaczenia. Z punktu widzenia architektury programu decyzja o u\u017cyciu funkcji jako no\u015bnika logiki zamiast klas czy struktur danych ma konsekwencje dla czytelno\u015bci i testowalno\u015bci. Funkcje czyste, pozbawione skutk\u00f3w ubocznych, \u0142atwiej testowa\u0107 jednostkowo i sk\u0142ada\u0107 w wi\u0119ksze algorytmy. Funkcje zale\u017cne od stanu zewn\u0119trznego (np. DOM w przegl\u0105darce) s\u0105 trudniejsze do izolowania w testach i wymagaj\u0105 dodatkowych mechanizm\u00f3w podstawiania zale\u017cno\u015bci. W kontek\u015bcie algorytmicznym funkcje pozwalaj\u0105 wyrazi\u0107 operacje rekurencyjne i iteracyjne w spos\u00f3b zbli\u017cony do zapisu matematycznego. Trzeba jednak bra\u0107 pod uwag\u0119 brak optymalizacji wywo\u0142a\u0144 ogonowych w wi\u0119kszo\u015bci \u015brodowisk JavaScript, co ogranicza praktyczne zastosowanie rekurencji dla du\u017cych danych wej\u015bciowych. Funkcja JavaScript: Przyk\u0142ady funkcji wy\u017cszego rz\u0119du i r\u00f3\u017cnych form zapisu J\u0119zyk Przyk\u0142ad kodu JavaScript \u2013 funkcja wy\u017cszego rz\u0119du javascript\\nfunction zastosuj(f, x) {\\n return f(x);\\n}\\n\\nfunction kwadrat(n) {\\n return n * n;\\n}\\n\\nlet y = zastosuj(kwadrat, 5);\\n JavaScript \u2013 wyra\u017cenie funkcyjne javascript\\nlet suma = function(a, b) {\\n return a + b;\\n};\\n\\nlet x = suma(1, 2);\\n JavaScript \u2013 funkcja strza\u0142kowa javascript\\nlet suma = (a, b) =&gt; {\\n return a + b;\\n};\\n\\nlet x = suma(1, 2);\\n C \u2013 funkcja jako wska\u017anik c\\nint kwadrat(int x) {\\n return x * x;\\n}\\n\\nint zastosuj(int (*f)(int), int x) {\\n return f(x);\\n}\\n\\nint y = zastosuj(kwadrat, 5);\\n Kr\u00f3tkie uwagi praktyczne Problem Opis Niejawny undefined Brak return powoduje zwr\u00f3cenie undefined, co \u0142atwo przeoczy\u0107 w z\u0142o\u017conych \u0142a\u0144cuchach wywo\u0142a\u0144. Mutacja obiekt\u00f3w Przekazywanie obiekt\u00f3w do funkcji mo\u017ce zmienia\u0107 ich stan poza funkcj\u0105, co utrudnia \u015bledzenie b\u0142\u0119d\u00f3w. this zale\u017cne od wywo\u0142ania Ten sam kod funkcji mo\u017ce dzia\u0142a\u0107 inaczej w zale\u017cno\u015bci od kontekstu wywo\u0142ania. Rekurencja Brak optymalizacji ogonowej w praktyce ogranicza g\u0142\u0119boko\u015b\u0107 rekurencji. Techniczne domkni\u0119cie notatek: funkcja jako narz\u0119dzie my\u015blenia o kodzie Funkcje s\u0105 podstawowym mechanizmem porz\u0105dkowania logiki w JavaScript i innych j\u0119zykach, ale ich konkretna semantyka \u2013 zwi\u0105zana z zakresem zmiennych, kontekstem wywo\u0142ania i sposobem przekazywania danych \u2013 wymaga \u015bwiadomego projektowania, zw\u0142aszcza w wi\u0119kszych programach, gdzie drobne r\u00f3\u017cnice w zachowaniu funkcji przek\u0142adaj\u0105 si\u0119 na realne b\u0142\u0119dy i problemy utrzymaniowe.<\/p>\n","protected":false},"author":1,"featured_media":1088,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-1087","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kodowanie"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1087","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1087"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1087\/revisions"}],"predecessor-version":[{"id":1089,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1087\/revisions\/1089"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1088"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}