我想了解这段代码的工作原理。我终于想通了它是一个循环。它不是一个“while”或“for”循环,但它仍然是一个循环,因为我自己称之为(如果我错了,请纠正我)。
我理解它的主要功能:在jQuery加载到我的'foo'函数时传递JQuery,当jQuery加载时。为此,它会在Window
中检查jQuery,如果没有,则重置timer()
。这就是循环。我知道了。
让我解释一下我不明白的地方:
CheckDependency.Deferred.execute(foo);
execute
让我感到困惑:我希望如果我致电CheckDependency.Deferred.execute
它只会执行该方法。为什么它显然运行计时器功能。为什么它不能简单地在timer()之后有那个代码,因为它继续循环然后返回jquery?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);
答案 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>
我希望我做到这一点,我希望我的回答有所帮助!如果您有任何疑问,请与我们联系。