2016-01-14 2 views
0

Я пытаюсь понять, как работает этот код. Я, наконец, понял, что это петля. Это не цикл «while» или «for», но, тем не менее, это цикл, в силу того, что я называю себя (пожалуйста, поправьте меня, если я ошибаюсь).Может кто-нибудь объяснить этот код Javascript?

Я понимаю, что это основная функция: передать JQuery, когда он загружен в мою функцию foo, когда загружен jQuery. Для этого он проверяет jQuery на Window, и если нет, он сбрасывает timer(). Это петля. Я понимаю.

Позвольте мне объяснить, что я не понимаю:

  1. вызов: CheckDependency.Deferred.execute(foo);
    • почему "отложенным" ключевое слово?
    • execute baffles me: Я ожидаю, что если я позвоню CheckDependency.Deferred.execute, он выполнит только этот метод. Почему это явно работает функция таймера. почему он не мог просто получить этот код после таймера(), так как он продолжает цикл, а затем возвращает jquery?
  2. Говоря о возврате. Почему там есть метод? CheckDependency.Deferred.execute(foo); как сумасшедший для меня, как CheckDependency.Deferred.RETURN.execute(foo); (или какого-то подобного сумасшедшего заявления)

Я довольно новый для JavaScript (с PHP). Вот код:

function foo(){ console.log('jQuery found!'); 
} 
var CheckDependency = CheckDependency || { }; 
CheckDependency.Deferred = function() 
{ 
    var functions = []; 
    var timer = function() { 
     if (window.jQuery) {/* && window.jQuery.ui*/ 
      while (functions.length) { 
       functions.shift()(window.jQuery); 
      } 
     } else { 
      window.setTimeout(timer, 250); 
     } 
    }; 
    timer(); 
    return { 
    execute: function(onJQueryReady) 
    { 
     if (window.jQuery) { // && window.jQuery.ui 
      onJQueryReady(window.jQuery); 
     } else { 
      functions.push(onJQueryReady); 
     } 
    } 
    }; 
}(); 
CheckDependency.Deferred.execute(foo); 
+1

Это довольно прямолинейно, 'execute' - это функция, которая запускается, когда вы ее вызываете.Похоже, что он ждет экземпляр jQuery. – Shanimal

+1

Google для подходящих учебных пособий –

+0

Вы понимаете, что означает 'CheckDependency.Deferred = function() {...}()' does? –

ответ

2

Позвольте мне сказать, я не эксперт Javascript, но я балуюсь :) Я возьму удар в описании того, что здесь происходит.

Во-первых, это создает новый объект под названием «CheckDependency».

var CheckDependency = CheckDependency || { }; 

Далее он выполняет анонимную функцию и сохраняет результат в CheckDependency.Deferred.

CheckDependency.Deferred = function() 
{ 
    . 
    . 
    . 
    . 
}() 

Анонимная функция работает следующий код:

var functions = []; 
var timer = function() { 
    if (window.jQuery) {/* && window.jQuery.ui*/ 
     while (functions.length) { 
      functions.shift()(window.jQuery); 
     } 
    } else { 
     window.setTimeout(timer, 250); 
    } 
}; 
timer(); 

Последняя часть кода функции возвращает новую функцию execute, которая дает CheckDependency.Deferred функцию execute.

return { 
    execute: function(onJQueryReady) 
    { 
     if (window.jQuery) { // && window.jQuery.ui 
      onJQueryReady(window.jQuery); 
     } else { 
      functions.push(onJQueryReady); 
     } 
    } 
    }; 

Наконец, эта новая функция называется

CheckDependency.Deferred.execute(foo); 

Конечным результатом этого является то, что код начинается фоновый таймер, который не называет себя до тех пор, window.jQuery верно - что означает jQuery загружен. Затем функция, переданная в execute, передается в этот цикл, и как только будет доступен jQuery, исходная функция, переданная в «execute», будет вызываться с экземпляром window.jQuery.

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

+0

Я не могу поблагодарить вас достаточно! Я получаю это сейчас! Специально «** _, который дает CheckDependency.Deferred функцию execute _ **». – AlexHill

+0

Awesome! Glad Я мог бы помочь :) –

Смежные вопросы