有人可以解释这个Javascript代码吗?

Can someone explain this Javascript code?

本文关键字:Javascript 代码 解释      更新时间:2023-09-26

我试图理解这段代码是如何工作的。我终于发现这是一个循环。它不是一个"while"或"for"循环,但它仍然是一个循环,因为我认为它自称(如果我错了,请纠正我)。

我知道它的主要功能是:当JQuery加载到我的"foo"函数时,当jQuery加载时,传递JQuery。为此,它会在Window中检查 jQuery,如果没有,它会重置timer() 。这就是循环。我明白了。

让我解释一下我不明白的地方:

  1. 电话:CheckDependency.Deferred.execute(foo);
    • 为什么是"延迟"关键字?
    • execute让我感到困惑:我希望如果我调用CheckDependency.Deferred.execute,它只会执行该方法。为什么它显然运行计时器功能。为什么它不能简单地在 timer() 之后有该代码,因为它一直在那里循环然后返回 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);

首先让我说我不是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为 true - 这意味着加载jQuery。 然后,传递给execute的函数被传递到这个循环中,因此一旦jQuery可用,传递给"execute"的原始函数将与window.jQuery的实例一起调用。

我希望

我做到了正义,我希望我的答案有所帮助! 如果您有任何问题,请告诉我。