说 JSLint 不会告诉您有关已弃用的属性的说法相当不公平。让我解释一下。
首先回想一下,JavaScript 是一种动态语言。您可以将任何属性分配给 [几乎] 任何对象。如果您愿意,只需说出window.all = "Muahahaha!!! I'm evil!!!",就可以在浏览器上下文中将all 分配给window。您可以将.all 添加到带有...的字符串中
var spam = "a string";
spam.all = "I'm still evil!!!"
或者,更糟糕的是,某些代码可能已经更改了您文件之外某处的String(或任何其他对象类型)的原型。在浏览器控制台中试试这个:
String.prototype.all = String.prototype.all || "This is beyond evil.";
// 'This is beyond evil.'
var spam = "spam"
// undefined
spam.all
// 'This is beyond evil.'
所以默认情况下,JSLint 不会按名称检查对象的属性。尤其是对于可能存在于文件上下文之外的对象(因为 JSLint 逐个文件地 lints),它根本无法知道对象的属性发生了什么并识别什么是有效的,什么是无效的。
(这就是TypeScript 的用途,顺便说一句。)
除非你告诉 JSLint 如何!! -- JSLint property 指令 ftw
或者您可以使用JSLint property directive,如果您愿意做一些工作,它正是您想要做的。
如果您将属性指令放在文件的顶部,JSLint 将为页面上不在该列表中的对象使用的任何属性显示错误。
例如,试试这个on the official JSLint.com page:
/*property
log
*/
/*jslint browser, devel */
function mySpam() {
var spam = document.all;
console.log(spam);
}
看看我如何使用document.all 但all 不在property 指令中?这对我来说会出错。
1. Unregistered property name 'all'.
var spam = document.all;
您可能会说,“但我要永远从我正在 linting 到该指令中的 3000 行文件中获取所有 good 属性!”
不是这样!这里有一个提示:将您的文件(即使是未整理的)粘贴到 JSLint.com 中。它将在其报告中为您创建一个property 指令。
这是我在几秒钟内从AngularJS' [sic] route.js 制作的一个:
/*property
$$minErr, $evalAsync, $get, angularVersion, caseInsensitiveMatch, create,
defaultPrevented, eagerInstantiationEnabled, extend, info, isArray,
isDefined, isObject, isUndefined, length, module, noop, originalPath,
otherwise, preventDefault, provider, redirectTo, reload, reloadOnSearch,
reloadOnUrl, routes, run, substr, when
*/
按字母顺序排列,偶数。
现在只需删除你不想要的那些并立即!你会抓住你需要的一切。
这有点乏味吗,是否需要对正确使用document 的文件进行一些按摩/培训?是的,但是,再一次,在动态语言中,这接近于您对逐个文件的 linter 所能期望的最好结果。
注意:如果这不能解决您的问题,无论多么不完美,那么我们需要查看您的更多文件并更准确地了解您在实践中要解决的问题。