document.ready()中的局部变量和其他已定义的函数

时间:2012-11-08 15:51:44

标签: javascript jquery scope

在jQuery中,您可以对各种页面和其他事件进行多次调用,如下所示:

$(document).ready(function() {

您可以在此过程中添加多个“就绪”功能定义,但不限于一个。当然,这有助于将代码定义为接近使用它的位置。

我的问题是,如果在其中一个document.ready函数声明中我使用var声明了一个局部变量,它是否会在页面也使用的另一个document.ready函数声明中可用?

我不确定jQuery在这样的情况下是如何工作的;它是否以某种方式将各种函数的范围编织在一起,或者当ready事件被触发时,每个函数是否以独立方式运行,每个函数都不知道其他函数的变量。 (我猜第二个。)

2 个答案:

答案 0 :(得分:7)

  

我的问题是,如果在其中一个document.ready函数声明中我使用var声明了一个局部变量,它是否会在页面也使用的另一个document.ready函数声明中可用?

不,它们是您传递给document.ready的函数的局部变量。

  

我不确定jQuery在这样的情况下是如何工作的;它是否以某种方式将各种函数的范围编织在一起,或者当ready事件被触发时,每个函数是否以独立方式运行,每个函数都不知道其他函数的变量。 (我猜第二个。)

你是对的。 :-)实际上,jQuery 不能组合函数的执行上下文,它们由JavaScript引擎管理。

但是,您可以将它们全部共享一个父执行上下文,方法是将它们全部放在容器函数中:

(function() {
    // Shared by all functions within this block
    var foo = 42;

    // ...

    $(document).ready(function() {
        if (foo === 42) {
            // ...
            --foo;
        }
    });

    // ...

    $(document).ready(function() {
        if (foo > 0) {
            // ...
            --foo;
        }
    });

})();

我认为除非你正在编写一个库,否则我主张拥有多个ready处理程序(甚至是一个)。但这是一个不同的话题。

答案 1 :(得分:2)

不,不会。每个$(document).ready将定义它自己的范围。如果你需要两者都可见,你可以使它成为全局,或者在另一个闭包中定义所有$(document).ready(例如使用自调用函数)。