从jQuery Document Ready中访问变量

时间:2014-07-25 14:46:29

标签: javascript jquery variables global-variables

我有一个简单的事情:

function init() {
    var $something = 'something';
}

jQuery(document).ready(function($) {
   init();
   alert($something);
}

我认为这会有效,但事实并非如此,控制台说没有定义$。问题是什么? 非常感谢!

3 个答案:

答案 0 :(得分:3)

$ something在函数'init'的范围内定义,因此您只能从该函数中访问它。如果你想获得一个值,你可以返回它,如下所示:

function init() {
    var $something = 'something';
    return $something;
}

jQuery(document).ready(function($) {
   var $something = init();
   alert($something);
}

请注意,这两个变量都具有相同的名称(通常是个坏主意)。它们各自都在自己的范围内定义,因此它们是完全不同的变量。

另一种模式可能是包装整个事物并使用该范围,如下所示:

(function () {
    var $something;

    function init() {
        $something = 'something';
    }

    jQuery(document).ready(function($) {
        init();
        alert($something);
    }
})();

这样你就有了一个变量,但是你可以避免污染全局命名空间。

编辑:

在回复您的评论时,上述内容可以写成:

var newscope = function () {
    var $something;

    function init() {
        $something = 'something';
    }

    jQuery(document).ready(function($) {
        init();
        alert($something);
    }
}
newscope();

但是我已经定义了函数AND并且基本上同时调用它而不必给它命名。

答案 1 :(得分:2)

这是一个范围问题。

$somethinginit()函数的范围内定义,因此,当init()函数完成时,它将被处理掉。

答案 2 :(得分:0)

使用var声明的Vars将是声明它们的闭包的本地。正如您所发现的那样,这意味着,在该闭包之外,它们是无法到达的。

围绕这个有很多方法,每个方法都有不同的设计模式。这是您可以使用的一种模式:

({
    init: function() {
        this.something = 'hello';
        jQuery(function() { this.dom_ready(); }.bind(this));
    },
    dom_ready: function() {
        //DOM code here
        alert(this.something); //hello
    }
}).init();

这里我声明了对象或命名空间的几种方法。由于它们属于这个对象的上下文,并且在这个对象的上下文中被调用,因此它们之间通过属性而不是变量进行通信。

因此,变量被降级为仅在声明它们的闭包内(但从不在其外部)有用。

此模式的一个优点是,您可以将任何需要等待DOM准备好的代码从任何不具备的代码中分离出来。这是通过使用专用的dom_ready方法实现的。