LINUX.ORG.RU

Javascriptачи-трюкачи

 


0

1

Привет, ЛОР. Читаю тут простыни разного джаваскрипта и не раз наталкиваюсь на такие конструкции:

(function() {
 ...
 // здесь тело функции
 ...
})();

или даже так:

(function(foo) {
 ...
})(this);

Что это за такие трюки, ЛОР? Объясни мне, ламеру, почему бы просто не написать код прямым текстом, без оборачивания в функцию? Эффект ведь тот же будет. И да, закралась мысль, что трюкачи подобным образом эмулируют отсутствующие в языке C-style скоупы, но ведь для этого же есть кошерный let. Короче, тут следует картинка с лётчиком и признанием, что я совершенно ничего не понял.


Похоже на lisp, наверно он и генерит этот жабоскипт :D

Spirit_of_Stallman ★★★
()

Если вкратце, то это - вызов анонимной функции (в первом случае) и вызов анонимной функции с передачей контекста в виде параметра по ссылке - во втором.

А аналогов в си вы не найдете, ведь си - ЯП со статической типизацией)))

k0valenk0_igor ★★★
()
Последнее исправление: k0valenk0_igor (всего исправлений: 1)
Ответ на: комментарий от anonymous

что бы не засорять global-scope.K.O.

Только-то и всего? Ну, значит, я был недалёк от истины с мыслью о скоупах. Спасибо.

BYHYRT
() автор топика
Ответ на: комментарий от k0valenk0_igor

Если вкратце, то это - вызов анонимной функции (в первом случае) и вызов анонимной функции с передачей контекста в виде параметра по ссылке - во втором.

Дык это всё понятно. Непонятно было, зачем писать так, когда можно в лоб. Но вон анонимус выше уже разжевал.

BYHYRT
() автор топика
Ответ на: комментарий от k0valenk0_igor

А аналогов в си вы не найдете, ведь си - ЯП со статической типизацией)))

Кстати... чёй-то не найду-то? :) пожалуйста (С++11):

([](){
 ...
})();

Да и типизация тут ни при чём особо, тут всё в наличии/отсутствии анонимных функций

BYHYRT
() автор топика
Ответ на: комментарий от k0valenk0_igor

А аналогов в си вы не найдете

расширение в clang:

~$ cat 1.c
#include <stdio.h>
 
int main(void) {
    ^(void){ printf("hello world\n"); }();
}

~$ clang -fblocks 1.c -lBlocksRuntime && ./a.out
hello world
wota ★★
()

man анонимные функции, замыкания

Bad_ptr ★★★★★
()

почему бы просто не написать код прямым текстом, без оборачивания в функцию?

Один из распространенных (и всячески поощряемых) приемов управления сложностью.

outtaspace ★★★
()

так оно атомарно выполнится, для этого

quest ★★★★
()

Я так неймспейсинг делаю, можно по файлам код раскидывать

(function(Application, undefined) {

  //тут код

})(window.Application= window.Application || {});
Dantix ★★
()

Ты ещё юзерскрипты не видел, там бывает что-нибудь типа

(function (window, undefined) {
    // тут ещё дюжина строчек сношаний с window и unsafeWindow
    // а в итоге объекта окна в какой-нибудь третей переменной
})(window)

Kalashnikov ★★★
()

А Крокфорд говорит, что так стоящие скобки:

(function() {
 ...
})()
болтаются, как яйца у кобеля. Так эстетичнее и работает, внезапно, так же:
(function() {
 ...
}())

anonymous
()

но ведь для этого же есть кошерный let.

let expressions/let statements появились только в JS 1.7 и драфте ECMAScript 6

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.