如何正确解决这个 JSHint “可能的严格违规”

Posted

技术标签:

【中文标题】如何正确解决这个 JSHint “可能的严格违规”【英文标题】:How to properly address this JSHint "Possible strict violation" 【发布时间】:2015-05-19 06:31:34 【问题描述】:

编辑:此问题与 JSHint 相关,而不是 JSLint - 更改了标签。

以下给了我一个“可能的严格违规”。我理解为什么会发生违规 - 这是因为在 jslint 不认为是方法的函数中使用了 this

function Widget(name)
   this.name = name;


Widget.prototype.doSomething = doSomething;

function doSomething()
   console.log(this.name + " did something");

虽然,以下方法解决了 jslint 警告,但它们迫使我进入我宁愿避免的代码组织:

1) 内联声明函数:

Widget.prototype.doSomething = function ()
   console.log(this.name + " did something");

2) 创建一个传递this的包装函数:

Widget.prototype.doSomething = function () return doSomething(this); ;

function doSomething(self)
  // ...

除了使用上述方法之外,还有其他方法可以组织代码来解决问题吗?

【问题讨论】:

在您的评论中,您使用的是 JSHint,我认为这可以解释断开连接。你能证实吗?这可能是标签编辑时间。 ? 好交易;祝你好运。我会删除我的答案。 【参考方案1】:

正确解决这个问题的方法是你的问题。做#1:

Widget.prototype.doSomething = function ()
   console.log(this.name + " did something");

linting 的全部意义在于它可以防止您在源代码中犯下常见错误,而且您看到的错误是完全正确的:您不应该看到this 中提到的未在对象上声明的函数。

Linting 与程序在执行时的行为方式无关。并不是 linting 不“相信”您的方法会在一个对象上被调用,而是您的 源代码 包含一个已知有问题的模式。您可以随心所欲地解决它,但只要 pattern 仍在您的源代码中,您仍然会遇到 linting 问题。

如果你想忽略它,那么将它包裹在/*ignore jslint start*//*ignore jslint end*/中,但问题仍然存在。

【讨论】:

我认为嵌入式this 很好;请参阅我的答案,它在 JSLint.com 上使用 "use strict;" 进行 lint。 Crockford 的当前版本也不支持/*ignore jslint start*/。见39 upvotes of a comment that that doesn't work at this linked question。 谢谢。实际上,lint 有一种更精确的处理方式:/*jshint validthis: true */,但 #1 使对象的公共属性在代码中不那么明显。我通常将所有公共属性组织在顶部,并将其余的“肉”留在下面的函数中。 这是在原型上声明函数的最佳方式。它非常清楚我们在谈论哪个this。将“肉”与声明分开会使人们在文件中滚动跳转并浪费时间。来自我的 +1。 所以,答案是“不,甚至不打扰”? @NewDev 是的。 linter 正在按预期工作。要么接受它的建议,要么抑制/忽略这个错误,或者不使用 linter。

以上是关于如何正确解决这个 JSHint “可能的严格违规”的主要内容,如果未能解决你的问题,请参考以下文章

为啥 JSHint 反对位运算符?我应该如何表达这个代码?

无法通过 npm 安装 gulp-jshint

JSHint 是不是支持异步/等待?

如何忽略 '$' 未定义 JsHint 错误。 (Visual Studio 2010 JsHint 扩展)

Jshint.com |分配给“这个”

如何将全局配置传递给 jshint?