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

时间:2016-01-14 18:46:01

标签: javascript function oop

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

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

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

  1. 电话:CheckDependency.Deferred.execute(foo);
    • 为何选择“Deferred”关键字?
    • execute让我感到困惑:我希望如果我致电CheckDependency.Deferred.execute它只会执行该方法。为什么它显然运行计时器功能。为什么它不能简单地在timer()之后有那个代码,因为它继续循环然后返回jquery?
  2. 说到回归。那里为什么有方法? CheckDependency.Deferred.execute(foo);对我来说和CheckDependency.Deferred.RETURN.execute(foo);(或类似的疯狂陈述)一样疯狂。
  3. 我是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 个答案:

答案 0 :(得分: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的实例调用。 / p>

我希望我做到这一点,我希望我的回答有所帮助!如果您有任何疑问,请与我们联系。