我正在使用JSLint探测我的代码是否存在错误,到目前为止,当我的全局应用程序变量未定义时,我设法修复了除问题之外的所有错误。
我在JSlint正常使用之前使用了这段代码:
var APP = APP || (function {
return {
init: function () {
}
};
}(window.document));
然后我会打电话给
APP.init();
初始化。但JSlint不喜欢全局变量所以我将代码更改为:
(function (global){
var APP = {
init: function () {
}
};
return APP;
}(window.document));
此代码通过JSLint测试没有问题,但随后 当我打电话给APP.init();它说APP在定义之前使用,这是事实。 你会推荐什么,以便我不使用全局变量但仍然创建我的应用程序对象,而我的代码通过JSlint测试?
答案 0 :(得分:1)
(function (global){
var APP = {
init: function () {
}
};
return APP;
}(window.document));
上面创建了一个范围/闭包,这样只有匿名函数中的代码才能访问APP变量。 JSHint有设置,所以你可以设置可接受的全局变量(比如jquery等),我会添加APP
,如果其余的传递,你知道你只有一个变量/模块是全局的。如果您正在使用任何第三方库,则无论如何您已经拥有多个全局变量
答案 1 :(得分:1)
第一个代码
在您的原始代码中,您可能遇到的实际错误是
#1 'APP' used out of scope.
var APP = APP || (function() { // Line 1, Pos 11
这不是因为JSLint讨厌全局变量,而是因为它不喜欢分配给它的变量在同一个var
语句中定义。
更改代码以使用其他变量名称可以解决此问题
var app = APP || (function() {...}(..));
但是,人们会期望APP
已经在当前范围内定义。否则你会得到
#1 'APP' was used before it was defined.
第二个代码
它不起作用,因为APP
仅在您创建的函数对象中可见。它在外面的任何地方都看不见。由于您要在全局范围内定义APP
,您只需将其附加到window
对象,就像这样
(function(global) {
global.APP = {
init: function() {
}
};
}(window));
然后
APP.init()
会正常工作。
您可以直接定义APP
,而不是通过所有这些
window.APP = {
init: function () {
"use strict";
...
}
};
答案 2 :(得分:1)
在你give up on JSLint之前,要知道它根本不介意全局化;它只是希望您使用特殊格式声明它们,以便其他人阅读您的代码时确切知道发生了什么。
唯一的"技巧"在这里,如果您的全球APP
尚未初始化,您确实需要检查其真实性",就像使用APP = APP || (function...
一样。然后你做需要使用window
(或者你的全局对象是什么 - 例如,如果你使用Node,那就不同了)前缀技巧。
以下是:
/*jslint white:true, sloppy:true, browser:true */
/*global APP */
window.APP = window.APP || (function () {
return {
init: function () {
window.alert('JSLint doesn\'t like empty blocks');
}
};
}(window.document));
APP.init();
JSLint很高兴!
我理论上并不反对JSHint,但允许你设置各种额外设置的相同灵活性也会侵蚀整合,这在很大程度上是我发现代码linter的最佳好处。给你一个好的,稳定的运行,看看你最喜欢哪个!