javascript - 有人能解释一下这段 JavaScript 代码吗?

标签 javascript function oop

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

我理解它的主要功能:当 jQuery 加载到我的“foo”函数时,传递 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 传递一次可用时,将使用 window.jQuery 的实例调用传递给“execute”的原始函数。 .

我希望我这样做是公正的,希望我的回答对您有所帮助!如果您有任何疑问,请告诉我。

关于javascript - 有人能解释一下这段 JavaScript 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34797371/

相关文章:

javascript - 具有自定义属性的angularjs自定义指令

javascript - 您可以通过 Durandal activationData compose 绑定(bind)传递多个参数吗?

javascript - 如何使对象方法成为 IIFE?

java - 为什么我们在 Java 中为子对象分配父引用?

javascript - 如何在 swiper.js 中启用选择文本

javascript - 以 Angular 获取api数据

c++ - 文件 I/O 二进制动态数组崩溃

java - 如何在 Java 中循环播放音频?

python - 如何将我的函数放入类中。Beginner

c++ - 函数调用作为 C 宏的参数