我有一个简单的事情:
function init() {
var $something = 'something';
}
jQuery(document).ready(function($) {
init();
alert($something);
}
我认为这会有效,但事实并非如此,控制台说没有定义$。问题是什么? 非常感谢!
答案 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)
这是一个范围问题。
$something
在init()
函数的范围内定义,因此,当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
方法实现的。