为什么JSHINT抱怨这是一个严格的违反行为?


98

我认为这可能与使用此关键字并显示模块模式严格违规行为重复

我有这个代码:

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);
}

JSHINT(JSLINT)在抱怨。它说“严格违反”。对于突出显示的行:

在此处输入图片说明

Function.call()对实例的使用,然后再引用,是否有点不合适?

这被认为是不好的风格吗?


它只说“严格违规”,没有任何详细的错误消息吗?
stivlo 2011年

我无法重现该问题,我通过JSHint和JSLint运行了代码,而且似乎并没有抱怨什么。
彼得·奥尔森

54
请注意,如果您不尝试将其塞入可笑的单线:P中,这将更容易诊断。
多米尼克

1
我在另一个问题中看到了这一点(现在找不到)。它与的使用有关this。我不知道为什么JSLint会称其为“严格违规”,但是我确实知道,如果您不定义this函数的值,它将undefined处于严格模式。显然,您正在定义this,因此这不是问题。
user113716 2011年

2
您可以忽略这些可能的违规行为严格"-W040":true在配置JSON,但由于JSON没有意见,你不能告诉任何人,为什么它的存在。
kojiro

Answers:


124

JSHint说“可能严格违反”,是因为您所使用的this东西,就其所知,不是一种方法。

在非严格模式下,调用gotoPage(5)将绑定this到全局对象(window在浏览器中)。在严格模式下,this将为undefined,您会遇到麻烦。

大概是想在绑定的this上下文(例如gotoPage.bind(myObj)(5)或)中调用此函数gotoPage.call(myObj, 5)。如果是这样,您可以忽略JSHint,因为不会产生任何错误。但是,它告诉您您的代码对于任何阅读它的人来说都是不清楚的,因为this在显然不是方法的东西内部使用会造成很大的混乱。最好简单地将对象作为参数传递:

function gotoPage(sorter, s) {
    if (s <= sorter.d && s > 0) {
        sorter.g = s;

        sorter.page((s - 1) * sorter.p.size);
    }
}

function pageChange(event, sorter) {
    var dd = event.currentTarget;
    gotoPage(sorter, dd[dd.selectedIndex].value);
}

12
即使这样,我认为它们在描述中还是有点误导。即使this最终成为undefined实际的问题也不只是严格的模式冲突。他们最好给出警告,说this可能是undefined在“严格模式”下,导致TypeError(或某物)出现。
user113716 2011年

11
确实@ ripper234,这就是为什么我总是使用event.currentTarget而不是this
多梅尼克(Domenic)2012年

4
我可以添加什么配置指令.jshintrc以禁用此检查?
callum 2014年

7
@callum“ validthis”:正确
Brett

18
使用/* jshint validthis: true */如果你只有一对夫妇和不希望改变每一个案件。
已知的2014年

93

我收到此消息的原因是它的功能不是以大写字母开头。

"use strict";

// ---> strict violation
function something() {
    this.test = "";
}


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}

28
我要指出的是,由于约定,jshint可能假定是大写字母SomethingS,这是一个构造函数,因此应使用来调用new。这样做定义this为基于“ Something.prototype”的新对象。最有可能是由于这样的假设,即它不会引发可能的严格违规警告。
安迪·梅尔兹

4
我在AngularJS提供程序上遇到此错误,因此应使用大写驼峰式方法名,而我使用小写驼峰式。固定。
Deminetix

当函数名称仅小写时,使用大写字母重命名时,我遇到了类似的问题。
GibboK 2015年

不要使用大写字母,因为它也是一个构造函数,您将面临另一个问题。相反,您可以使用:var fnAbc = function(){this.test =“”}
Hieu Tran AGI

大写字母不会更改函数内部功能的任何内容。程序员通常就是通过这种方式传达含义。换句话说:这不是技术问题,而是人类之间的交流之一。
彩饰

9

如果将函数声明为变量而不是使用标准函数声明,则jshint不会将其标记为严格违规。因此,您可以执行以下操作-

var gotoPage = function (s){
    if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);}
};


var pageChange = function (event, sorter) {
    var dd = event.currentTarget;
    gotoPage.call(sorter, dd[dd.selectedIndex].value);
};

0

如果您尝试实现一种方法,则可能要分配给原型:

ExampleClassName.protytpe.gotoPage = function gotoPage(s){
  // code using this
};

分配功能时,JSHint不会发出警告。


还是不够好。ClassName.prototype.myMethod = myMethod;,然后在下面定义方法。即使正确绑定了myMethod,您仍然会收到错误消息。
Jefftopia '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.