Как понять фрагмент кода вида (function(){}()) на js?

Доброго дня, уважаемые гуру
анализируя api одной из библиотек в примере обнаружил конструкцию вида:

(function(d, s, id){
    op1;
    op2;
   ...
}(document, 'script', 'jssdk'));

подскажите, пожалуйста, что вообще происходит здесь, зачем скобки оборачивают определение функции и что за последовательность в конце «(document, ’script’, ’jssdk’)»
и вопрос более общего плана, есть ли инструменты которые помогают понять зашифрованные конструкции подобного вида?

👍НравитсяПонравилось0
В избранноеВ избранном0
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

110 комментов в топике с ламерским вопросом. JavaScript явно глубоко коснулся сердец обитателей доу

Это они с непривычки. Кстати, у вас точно скобки на нужных местах, не надо ли их передвинуть?

(function(d, s, id){
op1;
op2;
...
})(document, ’script’, ’jssdk’);
в таком стиле?

Так и так будет правильно, просто кто то предпочитает вариант выше, кто то как вы

Та я знаю, просто глаз режет )

в js используют такую конструкцию, чтобы ограничить область видимости. переменные объявленные внутри функции, недоступны за её пределами. в то время как просто {var x = 1}; создаст переменную x в окружающей области видимости.

dou плавно мутирует в stackoverflow

dou плавно мутирует в stackoverflow
Та уж лучше СО чем корреспондент.нет

конец кода функция обращаеться к (веб-документ, строка_1,строка_2),
в данном контексте строка 1 вызывает скорее всего другой скрипт
строка 2 вызывает айди на страничке.
ор1 ор2. локальные переменные или функции... хз

Надеюсь, продавать у Вас лучше получается

ты меня не понял? ошибся.... идет вызов функции) просто иногда я путаюсь в словах. а так я все понимаю. просто это моя свободная интерпритация.

просто иногда я путаюсь в словах
в буквах тоже

Мда мой полет мысли, слишком далеко бывает заносит, что становлюсь невнимателен к деталям спасибо.

я думаю он специально )))

иногда да, иногда нет. просто граммота, она не простая, и несовсем логичная. Слишком много переменных как помне.

Так на то она и граММота, чтоб граМотным быть, так ведь? :)

да учусь, практика с писаниной не особо помогает, так как не понимаю принцепов потроения предложения.

Андрюша, брось ты и программирование, и русский язык — не твое это :)

да ну тогда знаешь, лучше я воевать в России буду, русский язык не знаю, считать не умею, писать не умею, думаю, я им отлично подойду на роль ополченца. ДА и когда мне выдадут автомат я буду стрелять в тебя.(сарказм)
По поводу не умею правильно писать так как, нет нормальных учебных материалов. Не понимаю я синтаксиса русского языка, реально. Понимаю, что пишут, но как загадка читаю кучу литературы, не могу писать правильно. Русский язык слишком он сложный, как и украинский, инглишь проще того его и учу постепенно. Как по мне если человек понимает твою мысль это хорошо, не важно сколько очепяток ты сделал.
Просто русский язык я интуитивно не понимаю и все хоть и привык к нему.

Да ты ж самострел устроишь, апалченец нашелся :)

просто недавно, пересмотрел 1984... годная вещь. и понял к чему подобное правление приведет, к фанатикам как ислам. ну нечего. Если Россия выдержит 20 лет уних будет все так.

Я только учу программирование (дизайнер), но это самовызываемая функция. Очень часто используется в js.

(function(аргументы) {
тело функции...
})(параметры);

var four = (function(a, b) { return a+b; })(1, 3);
four; // ->4

Используется для написания модулей, и кода, который исполняется в локальной области видимости функции и не загрязняет глоб область видимости переменных.

Если впосле выполнения не появляется замыканий, то объект функции удаляется из памяти чистильщиком мусора.

есть ли инструменты которые помогают понять зашифрованные конструкции подобного вида?
Да. Книги, документация, Гугл.

Самовызывающеяся. В JavaScript. В ожному місці аргументи а в іншому параметри. Яка між ними різниця, а?

Вы пошутили?

Вы объявляете (создаете) функцию с аргументами. А при вызове передаете на их место данные в виде параметров вызова функции.

Вообще-то, на самом деле наоборот.
Вы объявляете (создаете) функцию с параметрами.
А при вызове передаёте аргументы.

P.S.: Другая терминология:

  • при создании функции: формальные (formal) параметры
  • при вызове: фактические (actual) параметры

как то похоже, на что было первое:
курица или яйцо. только тут програмисткая метафизика)

Тут не философия, тут просто общепринятая терминология. (Точнее, их 2 — и обе я написал в комменте.)

ну просто я решил, внести философский подтест) в наше обсуждения.

А на самом самом деле в мене записано що

Аргументами называются неопределенные входящие данные.

Параметрами же являются известные данные.

І в вашому дописі є суперечність.

Я із такою конструкцією зустрічався в коді віджета на вордпресі. Неприємно читається.

Я ще не такий професіонал, щоб пропонувати альтернативу діючій мові програмування. Просто трохи вивчав Пітон, він приємніший до сприйняття, аніж Джаваскріпт.

Принимается.
Я тоже Forth учил, там хоть все понятно было, никаких функций и скобок.

на Лого программы вообще читаются как песня. Лучше языка не встречал :)

а что тут не так? все ясно как божий день, учите JS

Для будь-кого, хто має досвід в JS, це елементарна конструкція. А те, що для Вас то не звично — то не проблема JS. У кожній мові є свої підходи, які будуть незвичними, якщо в тій мові ти перший день. А півроку попишеш — і все ок, все звично і зрозуміло з першого погляду.

А я десь написав, що Джаваскрипт — лайно? Зрозуміло, що якщо «півроку поспілкуєшся на угорській мові — і все ок, все звично і зрозуміло з першого погляду».

А я десь написав, що Джаваскрипт — лайно?
А Вас ніхто в такому не звинувачує

А є якісь мови програмування, в яких все зрозуміло з першого погляду?

github.com/Ky6uk/PETOOH
Мені більше цей діалект подобається.

Крапки з комами порозставляй тут: (function(skills){return skills+’ Dev’}([’JS’,’SQL’])) а тоді будеш таке писати.

Крапки з комами порозставляй тут: (function(skills){return skills+’ Dev’}([’JS’,’SQL’])) а тоді будеш таке писати.
а что тут не так? все ясно как божий день, учите JS :)

Спробуйте так:
function(skills){
return
skills+’ Dev’
}([’JS’,’SQL’]))

Яка різниця?

Спробуйте так:
function(skills){
return
skills+’ Dev’
}([’JS’,’SQL’]))
Яка різниця?
1) учите JS :)
2) учите lisp :)

Код на Objective-C из-за общепринятых правил именования переменных вообще является идеалом читаемости и самодокументированности. ИМХО.

я к тому и спросил. Человеку должно понравиться.

Уже и ответить нечего, всё что можно было сказали до меня

Длинная запись:
var m = function(a, b, c, d, e) { ...}; //создание функции
m(1, 2, 3, 4, 5); //вызов только что созданной функции

Короткая запись:
function(a, b, c, d, e) { ...} (1, 2, 3, 4, 5);

Длинная запись:
var m = function(a, b, c, d, e) { ...}; //создание функции
m(1, 2, 3, 4, 5); //вызов только что созданной функции
Короткая запись:
function(a, b, c, d, e) { ...} (1, 2, 3, 4, 5);
короткая и не правильная :)

Гм. Только что проверил — все работает, как и ожилалось. Что именно неправильно-то?

Гм. Только что проверил — все работает, как и ожилалось. Что именно неправильно-то?
Скорее всего используете корректную конструкцию вместо той что вы указали в комменте
( stackoverflow.com/a/10668420 )
Собственно вывод из ХромДевТулс
function(a, b, c, d, e) { } (1, 2, 3, 4, 5);
VM2709:762 Uncaught SyntaxError: Unexpected token (

Гм. работает для:
var t = function(a, b, c, d, e) { } (1, 2, 3, 4, 5);
и
alert ( function(a, b, c, d, e) { } (1, 2, 3, 4, 5) );
И даже
( function(a, b, c, d, e) { } (1, 2, 3, 4, 5) );
и
( function(a, b, c, d, e) { }) (1, 2, 3, 4, 5);
Но не:
function(a, b, c, d, e) { } (1, 2, 3, 4, 5);

Я об этом же :)
Еще работает:

!function(a, b, c, d, e) { } (1, 2, 3, 4, 5);
Типа экономим 1 символ, по сравнению со сокбками.

И взрываем мозг всем непосвященным)

если самовызывающая функция используется в качестве модуля(ну, ограничение видимости переменных), то есть еще такая фишка:
;(function (..) { ... })(any-params);
на тот случай, если при деплое скрипты будут склеиваться(и минифицироваться). сэкономит кучу нервов, если кто-то допустит в одном из кусков не поставит «;» в конце и получится валидная конструкция, которая работает не так, как задумано

по моим впечатлениям создателям джаваскрипта не давали покоя лавры С, как языка который позволяет писать мозговзрывающие и компилируемым программы. поэтому в джаваскипт насовали самых разных вариантов написать код максимально запутанным

С хотя бы типизированный и язык, а это ....

в js — Строки, Числа, Boolean ;) так что это тоже типизированный язык

Не-а. Когда создавали JS — никто не думал, что программистам от него потребуются классы с приватными членами и методами, наследование, модули. Может лет через 5 разработают новую спецификацию и браузеры начнут её поддерживать — кто знает.

дак приватные члены и методы вроде особо не нужны.

JS создали за 10 дней и многое взяли потом от Microsoft IE. Мой первый язsr в изучении программирования (только начал), но он — знатное говнецо, имхо.

он еще и нецелые числа не умеет точно складывать и т д.

Ты удивишься, но PHP не умеет складывать нецелые числа (при необходимости точных расчетов используются специальные функции), и MySQL не умеет складывать нецелые числа (если тип столбца FLOAT, для точности нужно использовать тип DECIMAL).
Собственно, числа с плавающей запятой (float) в любом языке не обеспечивают точности. Для точности либо есть другие типы данных, либо библиотеки, которые выполняют вычисления с заданной точностью.

До пхп и баз еще не дошел. Даже не знаю какую книгу или видеокурсы выбрать.

Я пока книгу по вордпрессу читаю. Хочу сайт перенести с джумлы. Хотя уже не уверен в этом. Вордпресс урезанным кажется.

Вордпресс (голый) для блогов. Поэтому и кажется урезанным. Но я слышал о людях, которые на нём делают сайты. Есть разные плагины, и всё такое. Но там и программировать или не придётся, или хорошо бы уже уметь, чтобы писать свои плагины.

На WP можна все. Абсолютно. А коли ти навчишся це робити, то ще і нехіло платити будуть.

На WP можна все. Абсолютно.
напишіть мені драйвер до кавоварки під айпад на вордпресі?

Чого ти оце тут вийобуєшся? Прекрасно зрозуміло в якому контексті ми тут говоримо.

А ще, з людьми, які не розрізняють питальні і спонукальні речення, не працюю принципово.

До чого? Мене пруть люди що працюють у вузькій ніші, і забуваючи про це гордо заявляють про абсолютну універсальність їх інструмента.. А крім блогів і сайтиків на ВП, де його використання виправдане, є ще світи де його модна використати, але зосім вже через Ж, і є ті де це просто неможливо..
Банківсьий софт, системний, науковий, софт реального часу, медіа процессори, ігри, та мало їх таких..
А ви зі своїм «можна все, абсолютно!»...

1. Я популяризую платформу. Бо вона мені подобається і я бачу за нею майбутнє.
2. Я не бачу принципової різниці між WP і framework. І те, що вище описали — спокійно можна робити.

Короче, не придирайся до слів. Чувак сказав, що після Джумли WP «здається малофункціональним», а я сказав, що це абсолютно не так.

При чому тут твої процесори і науковий софт? Що за понти?

При чому тут твої процесори і науковий софт? Що за понти?
понти? реальні задачі які попадають в аутсорс, попадають джавістам, дотнетчикам, і найбільше- плюсистам, але ніразу не вордпресс «девелоперам»

При чому тут це? Зніми корону, дотнетчик ти від бога.
Все, на цьому закриваю дискусію. Важко говорити з такими.

і я бачу за нею майбутнє.
в тій маленькій ніші, про яку не варто забувати в постах... а то зе хтось повірить, що на ній можна все...
Я не бачу принципової різниці між WP і framework
в тому і проблема.
«я не бачу різниці між win 32 api та 1С програмами» — 1в1, порівняння абстракцій що на 2 рівня вкладеності стоять одна від одної, і якщо порівнювати саме фреймворк, а не asp.net mvc, то з набагато ширшею функціональністю
І те, що вище описали — спокійно можна робити.
/facepalm
там базові необхідні вимоги в більшості софту відкинуть не тільки ВП, а й веб рішення загалом...

Ти такий тугий, шо з тобою просто не хочеться говорити.

Тестуєш їх перед роботою?

На C можна все. Абсолютно. А коли ти навчишся це робити, то ще і нехіло платити будуть.

Це аж ніяк не виправдовує JavaScript.

Навчись спочатку програмуванню, потім читати що люди пишуть. Коментувати тобі зарано.

Чтобы не взрывало, то можно так:
void function(a, b, c, d, e) { } (1, 2, 3, 4, 5);
хотя...

А в консоле такая конструкция и не должна работать

Это аналог неймспейсов, опередляет облать видимости для вложенного кода

Нет, в данном примере — this внутри ссылается на глобальный объект (window)

(function(d, s, id){
alert( (this === window) ? true : false )
}(document, ’script’, ’jssdk’));

Всё он верно говорит. То, что this ссылается на window, не отменяет того факта, что объявленная внутри функции переменная не будет видна другим скриптам. А если такая функция будет возвращать объект, и результат её вызова присвоить глобальной переменной — получим singleton.

Плюс — на 20-30%% быстрее (в зависимости от браузера) происходит обращение к глобальным переменным, переданным в ф-цию в виде локальных переменных.

Меня вот что волнует: а чего не на стековерфлоу вопрос задан?

На стековерфлоу такой вопрос бы заминусили и удалили как дубликат.

Ну так бы узнал ответ. А тут глумятся только ;)

Зачем стековерфлоу, когда есть ДОУ?

ДОУ не для технических вопросов )

на доу был раздел «разработка». я предположил что вопрос немного касается разработки поэтому спросил его здесь

Это было что-то типа сарказма. Просто, технические вопросы тут обсуждаются очень редко, так исторически сложилось.

Зашифрованные конструкции...

Вам поможет (надеюсь) чтение этой книги: JavaScript: The Good Parts by Douglas Crockford

Вы действительно считаете, что этот вопрос дойстоен отдельной темы? Гугл не пробывали?

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

Очевидно же, что это immediately-invoked function expression</sarcasm>. Даже статья в википедии есть.

анонімна функція, яка відразу ж викликається. в даному випадку в параметри d, s та id йдуть document, ’script’ та ’jssdk’.
тобто

(document, ’script’, ’jssdk’)
- це просто виклик цієї ж функції.
тут більше інфи:
goo.gl/2cjJWi

(function() {}) - анонимная self involking функция... Т.е. она вызовется сразу после обьявления. Вот здесь можно почитать deadlock.org.ua/.../habr/post/3417

а здесь — (document, ’script’, ’jssdk’) - передача контекста.
Вот здесь очень хорошо объясняется что к чему ://habrahabr.ru/post/149516/

Подписаться на комментарии