JSLint 不喜欢 var
JSLint doesn't like var
我正在用 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 测试?
(function (global){
var APP = {
init: function () {
}
};
return APP;
}(window.document));
上面创建了一个scope/closure,这样只有匿名函数中的代码才能访问APP 变量。 JSHint 有设置,所以你可以设置可接受的全局变量(比如 jquery 等),我会添加 APP
到它,如果其余的通过你知道你只有那个 variable/module 作为全局变量.如果您正在使用任何第 3 方库,那么您可能已经拥有多个全局变量
第一个密码
在您的原始代码中,您得到的实际错误是
#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";
...
}
};
在你 之前,知道它根本不介意全局;它只是想让你用一种特殊的格式声明它们,以便其他阅读你的代码的人确切地知道发生了什么。
这里唯一的 "trick" 是如果您的全局 APP
有可能尚未初始化并且您真的需要检查它的 "truthiness",就像您对 APP = APP || (function...
。然后你 do 需要使用 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 的最大好处。给两个都好看,扎实运行,看看你最喜欢哪个!
我正在用 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 测试?
(function (global){
var APP = {
init: function () {
}
};
return APP;
}(window.document));
上面创建了一个scope/closure,这样只有匿名函数中的代码才能访问APP 变量。 JSHint 有设置,所以你可以设置可接受的全局变量(比如 jquery 等),我会添加 APP
到它,如果其余的通过你知道你只有那个 variable/module 作为全局变量.如果您正在使用任何第 3 方库,那么您可能已经拥有多个全局变量
第一个密码
在您的原始代码中,您得到的实际错误是
#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";
...
}
};
在你
这里唯一的 "trick" 是如果您的全局 APP
有可能尚未初始化并且您真的需要检查它的 "truthiness",就像您对 APP = APP || (function...
。然后你 do 需要使用 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 的最大好处。给两个都好看,扎实运行,看看你最喜欢哪个!