我使用以下命名空间模式:
var MyNamespace = new function () {
var foo = function () {
bar();
};
var bar = function () {
alert("bar");
};
this.init = function () {
foo();
};
};
$(document).ready(function() {
MyNamespace.init();
});
JSLint抱怨bar
在定义之前就被使用了。但是,直到声明bar
后才会调用foo
。该代码适用于我尝试过的所有浏览器:http://jsfiddle.net/jDKvz/
该模式是每个如何在 JavaScript 中声明命名空间?,第二个答案。
我需要在这里修复一些东西,还是应该忽略 JSLint?
我怀疑这是因为提升,变量和函数声明被解释器吊到顶部,很可能是这样看的:
var MyNamespace = new function () {
var foo;
var bar;
foo = function () {
bar();
};
bar = function () {
alert("bar");
};
this.init = function () {
foo();
};
};
现在在foo = function () {bar();};
内部,bar()
尚未解析,它只是一个变量bar
而不是此时要调用的函数。
话虽如此,如果你的代码工作正常,你可以使用它,打开strict mode
也很有帮助。
bar
是一个函数表达式而不是函数声明,这意味着它只有在分配后才能工作。你可以改用函数声明,jslint 不会再抱怨了。
function bar() {
...
}
另外,new Function
是不必要的,function
就足够了。
编辑:
似乎在这种情况下要摆脱new
使用自动调用函数(function(){}())
或对象文字{}
编辑:认为JS关闭了值,而不是变量。
JSLint 抱怨是因为它没有看到变量提升正在进行。只需在使用它们的函数之前定义其他函数使用的函数即可。它有助于使您的代码更具可读性,并关闭 JSLint。
例如:
var MyNamespace = new function () {
var bar = function () {
alert("bar");
};
var foo = function () {
bar();
};
this.init = function () {
foo();
};
};