Zaawansowany JavaScript: dlaczego ta funkcja jest owinięta w nawiasy? [duplikat]

Możliwy duplikat:
Co to jest konstrukcja (function () {}) () w JavaScript?

Natknąłem się na ten fragment kodu JavaScript, ale nie mam pojęcia, co z niego zrobić. Dlaczego dostaję "1", gdy uruchamiam ten kod? Co to jest ten dziwny mały dodatek do (1) i dlaczego funkcja jest owinięta w nawiasy?

(function(x){
    delete x;
    return x;
})(1);
Author: Peter Mortensen, 2012-01-29

4 answers

Dzieje się tu kilka rzeczy. Pierwszy jest natychmiast wywołane wyrażenie funkcji (IIFE) wzór:

(function() {
  // Some code
})();

Daje to możliwość wykonania kodu JavaScript we własnym zakresie. Jest on zwykle używany tak, że wszelkie zmienne utworzone w funkcji nie będą miały wpływu na globalny zakres. Możesz użyć tego zamiast:

function foo() {
  // Some code
}
foo();

Ale to wymaga podania nazwy funkcji, co nie zawsze jest konieczne. Użycie nazwanej funkcji oznacza również w pewnym momencie przyszłości funkcja może być wywołana ponownie, co może nie być pożądane. Używając funkcji anonimowej w ten sposób zapewniasz jej wykonanie tylko raz.

Ta składnia jest nieprawidłowa:

function() {
  // Some code
}();

Ponieważ musisz zawijać funkcję w nawiasy, aby była analizowana jako wyrażenie. Więcej informacji tutaj: http://benalman.com/news/2010/11/immediately-invoked-function-expression/

Tak szybko podsumować wzór IIFE:

(function() {
  // Some code
})();

Pozwala 'jakiś kod' ma być wykonany natychmiast, tak jakby był napisany w linii, ale także w swoim własnym zakresie, aby nie wpływać na globalną przestrzeń nazw (i tym samym potencjalnie zakłócać lub być zakłócanym przez Inne skrypty).

Możesz przekazać argumenty do swojej funkcji tak, jak byłaby to normalna funkcja, na przykład

(function(x) {
  // Some code
})(1);

Przekazujemy więc wartość '1' jako pierwszy argument do funkcji, która otrzymuje ją jako zmienną o lokalnym zasięgu o nazwie x.

Po Drugie, masz odwagę samego kodu funkcji:

delete x;
return x;

Operator delete usunie właściwości z obiektów. Nie usuwa zmiennych. Więc;

var foo = {'bar':4, 'baz':5};
delete foo.bar;
console.log(foo);

Wyniki w logowaniu:

{'baz':5}

var foo = 4;
delete foo;
console.log(foo);

Zarejestruje wartość 4, ponieważ foo jest zmienną, a nie właściwością, więc nie można jej usunąć.

Wiele osób zakłada, że delete może usuwać zmienne, ze względu na sposób działania autoglobali. Jeśli przypisujesz zmienną bez deklarowania jej po pierwsze, nie stanie się zmienną, ale właściwością obiektu globalnego:

bar = 4; // Note the lack of 'var'. Bad practice! Don't ever do this!
delete bar;
console.log(bar); // Error - bar is not defined.

Tym razem usuwanie działa, ponieważ nie usuwasz zmiennej, ale właściwości obiektu globalnego. W efekcie poprzedni fragment jest równoważny temu:

window.bar = 4;
delete window.bar;
console.log(window.bar);

I teraz możesz zobaczyć, jak to jest analogiczne do przykładu obiektu foo, a nie przykładu zmiennej foo.

 219
Author: Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 17:35:58

Oznacza to, że utworzyłeś funkcję anonimową I wywołałeś ją z parametrem 1.

Jest tak samo jak:

function foo(x) {
    delete x;
    return x;
}
foo(1);
 9
Author: xdazz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-29 14:19:22

Ludzie zwykle nazywają te "natychmiast wywołane wyrażenia funkcyjne" lub "samoczynnie wykonujące funkcje".

Chodzi o to, aby zmienne zadeklarowane wewnątrz tej funkcji nie wyciekały Na Zewnątrz.

 2
Author: hugomg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-29 14:44:39

Powodem, dla którego wciąż otrzymujesz 1 jest to, że słowo kluczowe delete służy do usuwania właściwości obiektów. Reszta jest tak jak inni komentowali, wszystko zawinięte w nawiasy jest wykonywane jako funkcja, a drugi zestaw nawiasów to argumenty przekazywane do tego bloku.

Oto odniesienie MDN dla delete i odniesienie MDN dla closures , które omawia również funkcje anonimowe.

 1
Author: dmp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-29 14:25:10