我使用以下命名空间模式:
var MyNamespace = new function () {
var foo = function () {
bar();
};
var bar = function () {
alert("bar");
};
this.init = function () {
foo();
};
};
$(document).ready(function() {
MyNamespace.init();
});
JSLint抱怨在bar
定义之前使用foo
。但是,在bar
声明之后才会调用{{1}}。该代码适用于我尝试过的所有浏览器:http://jsfiddle.net/jDKvz/
模式是How do I declare a namespace in JavaScript?,第二个答案。
我需要在这里修改一些东西,还是应该忽略JSLint?
答案 0 :(得分:1)
我怀疑是因为提升,变量和函数声明被解释器提升到最顶层,这很可能就是它的看法:
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
也很有帮助。
答案 1 :(得分:0)
编辑:思想JS关闭了值,而不是变量。
JSLint抱怨,因为它没有看到变量挂起。只需在使用它们的函数之前定义其他函数使用的函数。它有助于使代码更具可读性,并关闭JSLint。
例如:
var MyNamespace = new function () {
var bar = function () {
alert("bar");
};
var foo = function () {
bar();
};
this.init = function () {
foo();
};
};
答案 2 :(得分:0)
bar
是一个函数表达式而不是函数声明,这意味着它只能在被赋值之后才能工作。您可以使用函数声明,jslint不会再抱怨了。
function bar() {
...
}
此外,new Function
是不必要的,function
就足够了。
修改强>
似乎在这种情况下摆脱new
使用自动调用函数(function(){}())
或对象文字{}