我有一个很长的正则表达式,我想在我的JavaScript代码中拆分成多行,以根据JSLint规则保持每行长度为80个字符.我认为这对阅读来说更好.这是模式样本:
var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
Run Code Online (Sandbox Code Playgroud) 有一个JSLint选项,实际上是一个好的部分,"[需要]围绕立即调用的parens,"意味着构造
(function () {
// ...
})();
Run Code Online (Sandbox Code Playgroud)
反而需要写成
(function () {
// ...
}());
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 任何人都可以解释为什么第二种形式可能被认为更好?它更有弹性吗?不容易出错?它比第一种形式有什么优势?
自从提出这个问题以来,我逐渐理解了在函数值和函数值之间进行清晰视觉区分的重要性.考虑立即调用的结果是赋值表达式的右侧的情况:
var someVar = (function () {
// ...
}());
Run Code Online (Sandbox Code Playgroud)
尽管最外面的括号在语法上是不必要的,但是左括号给出了一个预先指示,即所分配的值不是函数本身,而是调用函数的结果.
这类似于Crockford关于构造函数大写的建议 - 它可以作为任何查看源代码的人的视觉提示.
当我的JavaScript调用一个在页面下面定义的函数而不是调用它时,JSHint会抱怨.但是,我的页面用于游戏,并且在整个内容下载之前不会调用任何函数.那么为什么订单功能出现在我的代码中呢?
http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
我在里面呻吟.看起来我需要花一天时间重新订购六千行代码.使用javascript的学习曲线根本不是很陡峭,但它非常loooooong.
我认为这可能是使用此关键字和显示模块模式的严格违规的重复
我有这个代码:
function gotoPage(s){
if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);}
}
function pageChange(event, sorter) {
var dd = event.currentTarget;
gotoPage.call(sorter, dd[dd.selectedIndex].value);
}
Run Code Online (Sandbox Code Playgroud)
JSHINT(JSLINT)正在抱怨.它说"严格违规".对于突出显示的行:

是我使用Function.call()然后引用实例,不知何故不合适?
这被认为是不好的风格吗?
嗨,我有3个javascript文件.
在file1.js我有
jQuery.noConflict()
jQuery(document).ready(function($) {
// ....
});
Run Code Online (Sandbox Code Playgroud)
我得到一个错误'jQuery'在定义之前就被使用了.并且"文档"在定义之前使用.
我如何安全地摆脱这个警告.
如果我做
var document = document || {};
Run Code Online (Sandbox Code Playgroud)
然后在我的utility.js中如果使用它,它将在IE中为null,在Firefox中为ok.
这是什么最好的解决方案?
最近,当我想出这个错误时,我通过JSLint运行了一些代码.我认为这个错误很有趣但它自动假设所有==应该是===.
这真的有意义吗?我可以看到很多你不想比较类型的实例,我担心这实际上会导致问题.
"预期"一词意味着每次都应该这样做.....这对我来说没有意义.
如果JSLint在这种情况下抱怨"i"是一个未使用的变量,我该怎么办:
var items = "<option selected></option>";
$.each(data, function (i, item) {
items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});
Run Code Online (Sandbox Code Playgroud)
(i,item)是参数的必需顺序,我只使用"item".
除了容忍未使用的变量或重写$ .each以使用索引之外还有其他解决方案吗?我不想做这两种解决方案吗?
提前致谢.
更新:我感谢所有的建议,但这段代码只是一个例子,向您展示我的意思,我有兴趣看到一个通用的解决方案,如果有的话.谢谢.
我注意到在CoffeeScript中,如果我使用以下方法定义函数:
a = (c) -> c=1
Run Code Online (Sandbox Code Playgroud)
我只能得到函数表达式:
var a;
a = function(c) {
return c = 1;
};
Run Code Online (Sandbox Code Playgroud)
但是,我个人经常使用函数声明,例如:
function a(c) {
return c = 1;
}
Run Code Online (Sandbox Code Playgroud)
我确实使用了第一种形式,但我想知道CoffeeScript中是否有一种生成函数声明的方法.如果没有这种方式,我想知道为什么CoffeeScript会避免这样做.我不认为JSLint会声明声明的错误,只要函数声明在作用域的顶部.
JSLint站点已更新,我无法再检查JS脚本.对我来说,这个警告并不重要,我不想通过数千行来解决这个问题,我想找到更多关键问题.
有人知道如何关闭此错误,或使用旧版JSLint?
UPDATE
例:
function doSomethingWithNodes(nodes){
this.doSomething();
for (var i = 0; i < nodes.length; ++i){
this.doSomethingElse(nodes[i]);
}
doSomething(); // want to find this problem
}
Run Code Online (Sandbox Code Playgroud)
jslint.com输出:
Error:
Problem at line 4 character 8: Move all 'var' declarations to the top of the function.
for (var i = 0; i < nodes.length; ++i){
Problem at line 4 character 8: Stopping, unable to continue. (44% scanned).
Run Code Online (Sandbox Code Playgroud)
问题:
在函数之上设置变量是新要求.我不能使用JSLINT来测试代码,因为它会停止扫描此错误的脚本.
我有很多代码,并且不希望将此警告威胁为严重错误.
更新8/22/2011:找到http://jshint.com,它看起来比http://jslint.com/好多了
jslint ×10
javascript ×9
jshint ×2
coffeescript ×1
expression ×1
function ×1
iife ×1
jquery ×1
readability ×1
regex ×1
strict ×1
syntax ×1
undefined ×1
vim ×1