• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

var foo = function bar(){} vs function foo(){}

42 Warsaw Coding Academy
0 głosów
1,622 wizyt
pytanie zadane 4 grudnia 2017 w JavaScript przez Alex.Ironside Stary wyjadacz (14,920 p.)

Witam. Juz ktorys raz spotykam sie z takim czyms

var foo = function bar(){console.log('test')}

Czym to sie rozni od

function foo(){console.log('test')}

I kiedy sie tego uzywa? Czym to przypisanie funkcji do zmiennej w ogole jest?

2 odpowiedzi

+1 głos
odpowiedź 4 grudnia 2017 przez niezalogowany

Function expression vs function declaration

Bardzo ciekawie różnica jest wyjaśniona w tym artykule. (Przy okazji dowiesz się czym jest hoisting)


Function declaration jest trochę pobłażliwe, ale moim zdaniem krótsze i czytelniejsze. Ważne, żeby wiedzieć, gdzie go używać.

1
komentarz 5 grudnia 2017 przez Comandeer Guru (607,060 p.)
Czemu pobłażliwe?
komentarz 5 grudnia 2017 przez niezalogowany
Ponieważ, na poziomie kodu, toleruje wywołanie funkcji przed jej definicją
komentarz 5 grudnia 2017 przez Comandeer Guru (607,060 p.)
Od tego są lintery. IMO ograniczenia spowodowane zrobieniem z funkcji zmiennej są o wiele gorsze niźli przewidywalny hoisting.
komentarz 5 grudnia 2017 przez ScriptyChris Mędrzec (190,190 p.)

Przypisywanie funkcji do zmiennej ma taką zaletę, że można przez let/const ograniczyć dostępność funkcji do bloku. Pamiętam też, że w IE i bodajże starszych Firefox nie można tworzyć zagnieżdżonych funkcji słówkiem function.

komentarz 5 grudnia 2017 przez Comandeer Guru (607,060 p.)

Pamiętam też, że w IE i bodajże starszych Firefox nie można tworzyć zagnieżdżonych funkcji słówkiem function.

W sensie

function cos() {
    function cos2 {}
}

? Taki kod bez problemu działa w IE nawet w quirks mode.

Przypisywanie funkcji do zmiennej ma taką zaletę, że można przez let/const ograniczyć dostępność funkcji do bloku.

Przecież ES6 definiuje w strict mode blokowy zasięg dla funkcji:

'use strict';

{
	function fn() {}
}

fn(); // Error

 

komentarz 5 grudnia 2017 przez ScriptyChris Mędrzec (190,190 p.)

Taki kod bez problemu działa w IE nawet w quirks mode

Pamiętam, że pojawiał się podobny błąd.

Tu nawet jest coś o tym wspomniane:

https://msdn.microsoft.com/library/br230269(v=vs.94).aspx

, konkretnie w wierszu tabeli, gdzie znajduje się komórka:

Funkcja zadeklarowana wewnątrz instrukcji lub bloku

Kojarzę, że napotkałem kiedyś problem z tworzeniem funkcji w funkcji lub w bloku przez słówko function. 


Przecież ES6 definiuje w strict mode blokowy zasięg dla funkcji:

Tego nie wiedziałem.

1
komentarz 5 grudnia 2017 przez Comandeer Guru (607,060 p.)
No tak, bo strict mode w ES5 zabraniał definiowania funkcji wewnątrz bloków… Niemniej ES6 zmienia to zachowanie. Więc na dobrą sprawę zostajemy z IE10-11, które mogą rzucać błędami dla funkcji deklarowanych w blokach ;)
komentarz 5 grudnia 2017 przez ScriptyChris Mędrzec (190,190 p.)

Hmm..., to może w tym przypadku przypisanie funkcji do zmiennej ma sens:

let fooRef;

{
	const bar = 'Hello World!';
	fooRef = foo;

	function foo() { console.log(bar); }
}

fooRef(); // Hello World!

"Wyciągnięta" z bloku funkcja foo ma, dzięki domknięciu, dostęp do zmiennej blokowej bar. Przykład pewnie nie życiowy, ale myślę że jakieś zastosowanie by się znalazło.

0 głosów
odpowiedź 4 grudnia 2017 przez surfeliza Stary wyjadacz (11,260 p.)
W pierwszym przypadku masz przypisanie funkcji do zmiennej - użyć tej funkcji będziesz mógł dopiero po deklaracji, w przypadku drugim natomiast w obrębie całego pliku.
komentarz 4 grudnia 2017 przez Alex.Ironside Stary wyjadacz (14,920 p.)
Wybacz ale dalej nie rozumiem. Jak sie wywoluje taka zmienna/funkcje? I dlaczego ma ta deklaracja fcji nazwe?
komentarz 4 grudnia 2017 przez ScriptyChris Mędrzec (190,190 p.)

w przypadku drugim natomiast w obrębie całego pliku

Nie do końca. Jeśli funkcję utworzoną ze słówkiem function utworzysz w lokalnym scope, to nie będziesz mieć do niej dostępu spoza tego scope.

Jak sie wywoluje taka zmienna/funkcje?

Tak samo. Funkcja to w JavaScript obiekt, który posiada wewnętrzną metodę [[call]]. Dzięki niej możesz wywołać kod znajdujący się wewnątrz niej.

W jaki sposób byś nie stworzył funkcji: przez wyrażenie (czyli przypisując do zmiennej lub tworząc IIFE), twierdzeniem (statement, wspomniane słówko function), konstruktorem (ze słówkiem new) - wywołujesz ją tak samo poprzez dopisanie po jej nazwie dwóch nawiasów i ewentualnie przekazując tam parametry.

 

komentarz 5 grudnia 2017 przez Alex.Ironside Stary wyjadacz (14,920 p.)

Dobra dalej mam troche ziemniaka w glowie. Po co w takim razie jest to bar w tym wypadku?

var foo = function bar (){} ? W sensie po co dajemy bar do tej funkcji? I jak to wywolac? foo() czy bar()?

Jakby bylo po prostu function bar(){} to wywolanie wyglada bar(). A w przypadku wyzej?

komentarz 5 grudnia 2017 przez ScriptyChris Mędrzec (190,190 p.)

bar to bezpośrednia nazwa dla funkcji i jest dostępna w ciele tej funkcji. Korzystając z niej, możesz bez udziału zewnętrznego scope, czy wskaźnika this (który lubi się "zgubić") wywołać funkcję bar rekurencyjnie lub zrobić z nią coś innego. Rzadko jednak widziałem stosowanie takiej techniki.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function#Named_function_expression

komentarz 5 grudnia 2017 przez Comandeer Guru (607,060 p.)

Najlepszy opis tego mechanizmu: https://kangax.github.io/nfe/

Rzadko jednak widziałem stosowanie takiej techniki.

Osobiście dość często go stosuję. 

komentarz 5 grudnia 2017 przez ScriptyChris Mędrzec (190,190 p.)

Osobiście dość często go stosuję.

Jakie korzyści Cię do tego skłaniają?

1
komentarz 5 grudnia 2017 przez Comandeer Guru (607,060 p.)
Głównie elegancka rekurencja czy taka sztuczka, jak możliwość odpięcia anonimowego listenera wewnątrz niego samego.
komentarz 5 grudnia 2017 przez ScriptyChris Mędrzec (190,190 p.)
Czy nazywasz wtedy funkcję tak jak zmienną do niej przypisaną (albo klucz obiektu), czy stosujesz jakąś konwencję nazewniczą?
1
komentarz 5 grudnia 2017 przez Comandeer Guru (607,060 p.)

Zależy. Ostatnio np. chciałem po prostu mieć wewnętrzny uchwyt i tyle.

Podobne pytania

0 głosów
1 odpowiedź 192 wizyt
pytanie zadane 9 listopada 2016 w JavaScript przez dran11 Początkujący (330 p.)
0 głosów
0 odpowiedzi 125 wizyt
pytanie zadane 8 kwietnia 2017 w PHP przez niezalogowany
0 głosów
1 odpowiedź 214 wizyt
pytanie zadane 7 listopada 2015 w JavaScript przez mrnoname Nowicjusz (220 p.)

93,394 zapytań

142,387 odpowiedzi

322,550 komentarzy

62,752 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...