Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите разобраться как работает этот скрипт (https://javascript.ru/forum/misc/63325-pomogite-razobratsya-kak-rabotaet-ehtot-skript.html)

mikhail apalaev 31.05.2016 19:57

Помогите разобраться как работает этот скрипт
 
<script>var scr = {"scripts":[
{"src" : "js/libs.js", "async" : false},
{"src" : "js/common.js", "async" : false}
]};!function(t,n,r){"use strict";var c=function(t){if("[object Array]"!==Object.prototype.toString.call(t))return!1;for (var r=0;r<t.length;r++){var c=n.createElement("script"),e=t[r];c.src=e.src,c.async=e.async,n.body.appendChild(c) }return!0};t.addEventListener?t.addEventListener(" load",function(){c(r.scripts);},!1):t.attachEvent? t.attachEvent("onload",function(){c(r.scripts)}):t .onload=function(){c(r.scripts)}}(window,document, scr);
</script>

aklis 31.05.2016 21:10

Обьяснюсь: было скучно, стало интересно разберусь ли в таком месиве.
Взял на себя труд привести код в более читабельный вид. Но тут возникла пара вопросов
var scr = {"scripts":[
      {"src" : "js/libs.js", "async" : false},
      {"src" : "js/common.js", "async" : false}
   ]};

  !function(t,n,r){
    "use strict";
    var c=function(t){
      if("[object Array]"!==Object.prototype.toString.call(t)) return!1;

	  for (var r=0;r<t.length;r++){
	    var c = n.createElement("script"), e = t[r];
	    c.src = e.src, c.async = e.async, n.body.appendChild(c); 
	   }

	  return !0
	};

    t.addEventListener ? t.addEventListener(" load",function(){c(r.scripts);},!1) :
    t.attachEvent ? t.attachEvent("onload",function(){c(r.scripts)}) :
    t.onload=function(){
      c(r.scripts)
    }
  };
  (window,document, scr);



Что это вообще за объявление такое?
!function(t,n,r){
Почему дебаггер не детектирует ошибку синтаксиса? Если синтаксис не нарушен - как это работает? Как такую функцию вызвать?

aklis 31.05.2016 21:23

Для ТС: Поидее этот скрипт добавляет в документ пару тэгов script, после запуска этой функции. Только тут ошибки есть. Как минимум пробел лишний вот тут
t .onload=function
после t не должно быть пробела.

upd:
Вот это новость для меня - этот пробел не приводит к ошибке синтаксиса, а я то думал что так вообще нельзя ;)

рони 31.05.2016 21:53

aklis,
24 строка точка с запятой лишняя

рони 31.05.2016 21:54

Цитата:

Сообщение от aklis
Что это вообще за объявление такое?

замена круглых скобок, чтобы исполнить анонимную функцию

рони 31.05.2016 21:59

Цитата:

Сообщение от aklis
Только тут ошибки есть. Как минимум пробел лишний вот тут t .onload=function

нету ошибок, есть неформатированный код

рони 31.05.2016 22:00

mikhail apalaev,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

aklis 31.05.2016 23:29

Точка с запятой лишняя потому что запись должна быть такая?
//представим что тут 23 строка
}(window,document, scr)

В скобках параметры которые получит функция при вызове?

aklis 31.05.2016 23:39

Точно параметры, ничем другим то быть не может. Спасибо Рони, за науку.


Часовой пояс GMT +3, время: 05:28.