3

我正在尝试通过自定义加载器加载一些 JavaScript 文件。以前我document.write()用来写出我所有的文件,但我想使用 jQuery。我绝对不是 jQuery 专家,只使用了一些更基本的特性和功能,所以我上网。好吧,我找到了以下代码,它确实有效,但我在理解它时遇到了一些麻烦。这是代码:

(function() {
    // Poll for jQuery to come into existence
    var checkReady = function(callback) {
        if (window.jQuery) {
            callback(jQuery);
        }
        else {
            window.setTimeout(function() { checkReady(callback); }, 100);
        }
    };

    // Start polling...
    checkReady(function($) {
        // Use $ here...
    });
})();

我理解代码正在检查 jQuery 是否可用,如果不可用,它将每秒检查一次。我也理解如果它可用,“轮询”下的代码将执行。我不理解的,以及我很难理解的,是整个callback参数和checkReady变量。 checkReady既是变量又是函数?如果它是一个变量,它是顶部的一个函数,那么它如何在下部的代码中具有与之关联的不同函数?另外,回调参数实际上在做什么?

4

3 回答 3

2

在 Javascript 中,函数是第一类的,这意味着它们可以分配给变量,作为参数传递并像对待任何其他变量一样对待,例如 a5"foo"

您在这里看到var checkReady = function(callback) { ... }的是分配给变量的函数checkReady

您在这里看到checkReady(function($) { ... });的是 checkReady以匿名函数作为参数调用在函数内部,this 用参数引用。匿名函数只是意味着您在那里有一个没有名称的文字函数,就像您可以在不命名它的情况下调用字符串文字一样。您可以对函数做同样的事情。它们可以被命名或内联作为没有名称的文字事物。 function($) { ... }checkReadycallback"foo"alert("foo");var str="foo"; alert(str);

您在这里看到window.setTimeout(function() { checkReady(callback); }, 100);的是window.setTimeout使用匿名函数调用的function() { ... },设置为在 100 毫秒内执行。在 100 毫秒内,它执行该函数,该函数包含一个递归调用,并使用它最初获得checkReady的相同callback参数。

那么在callback做什么呢?它旨在包含您确定 JQuery 已加载后想要执行的所有操作。基本上它是你程序的内容。您将整个程序像任何其他变量一样传递给另一个函数,该函数不时检查并在准备好时调用它。这就是一流功能的美妙之处。

于 2013-02-02T03:06:56.377 回答
1

也许这张漂亮的照片会有所帮助

 +-----------                      +------------+
 |          |                      |            |
 |       ...v.................     V            |
 |  +- - checkReady = function(callback) - -+   |
 |  :                              |        :   |
 |  :   callback() <-execute this--+        :   |
 |  :                anon func              :   |
 |  :                                       :   |
 |  +- - - - - - - - - - - - - - - - - - - -+   |
 |  :                                       :   |
 |  :                  +----------------------->+
 |  :                  |                    :   |
 |  :                  ^                    :   |
 +<---- checkReady(callback);               :   |
 |  :   call itself, sending the same       :   |
 |  :   anonymous callback function         :   |
 |  :                                       :   |
 |  +- - - - - - - - - - - - - - - - - - - -+   |
 |                                              |
 +-calls+                                       |
        |                                       |
        ^                                       |
    checkReady(function($) {                    |
        // this anon func goes here  >----------+
    });
于 2013-02-02T03:22:42.897 回答
0

编码

var name = function (params...) { ... statements ... };

创建一个未命名(匿名)函数并将对它的引用放入“name”变量中。重要的是此代码不会创建“名称”功能。“名称”仅存储对该函数的引用。可以将此引用复制到另一个变量,然后可以通过这个另一个变量调用函数,如下所示:

var newName = name;
newName(); // invokes the function 

如果您想了解更多关于 JavaScript 函数的信息,我认为您可能会觉得这很有趣:

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Functions

于 2013-02-02T03:12:45.353 回答