我在用JSLint检查我的代码中是否有错误,到目前为止,我设法修复了所有的bug,但当我的全局应用程序变量未定义时,问题除外。
在正确工作的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测试,您建议我不要使用全局变量,而是仍然创建我的应用程序对象。
发布于 2015-01-19 14:00:05
第一代码
在您的原始代码中,您可能会得到的实际错误是
#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";
...
}
};发布于 2015-01-19 13:49:17
(function (global){
var APP = {
init: function () {
}
};
return APP;
}(window.document));上面的内容创建了一个作用域/闭包,这样只有您的匿名函数中的代码才能访问APP变量。JSHint有设置,因此您可以设置可接受的全局值(如jQuery等等),我将在其中添加APP,如果其他部分传递给您,您知道只有一个变量/模块是全局的。如果您正在使用任何第三方库,那么无论如何您可能已经有几个全局var了。
发布于 2015-01-19 14:28:35
在您使用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,但允许设置各种额外设置的灵活性也会削弱一致性,这在很大程度上是我发现代码链接的最大好处。给两个好的,坚实的运行,看看你最喜欢哪一个!
https://stackoverflow.com/questions/28025999
复制相似问题