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

IT技术 javascript jslint strict jshint
2021-03-07 23:49:03

我认为这可能是使用此关键字并揭示module模式严格违规的重复

我有这个代码:

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()对实例的使用和引用是否以某种方式不合适?

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

4个回答

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

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

据推测,您的意思是使用绑定this上下文调用此函数,例如gotoPage.bind(myObj)(5)or 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);
}
@callum "validthis": 真
2021-04-22 23:49:03
我可以添加什么配置指令.jshintrc来禁用此检查?
2021-04-26 23:49:03
@ripper234 确实如此,这就是为什么我总是使用event.currentTarget而不是this.
2021-04-28 23:49:03
使用/* jshint validthis: true */如果你只有一对夫妇和不希望改变每一个案件。
2021-04-29 23:49:03
即便如此,我认为他们在描述中有点误导。即使this最终是undefined,那么实际问题不仅仅是严格模式违规。他们最好给出一个警告,说this可能是undefined在“严格模式”下,导致 a TypeError(或某事)。
2021-05-18 23:49:03

我收到了一条不以大写字母开头的函数的消息。

"use strict";

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


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}
我遇到了类似的问题,当函数名只有小写时,使用大写重命名。
2021-04-24 23:49:03
我会注意到 jshint 可能假设,由于约定,Something由于大写 S 是一个构造函数,因此应该使用new. 这样做定义this为一个基于“Something.prototype”的新对象。这很可能是由于这种假设,即它不会引发可能的严格违规警告。
2021-04-27 23:49:03
不要使用大写的首字母,因为它也是一个构造函数,你将面临另一个问题。相反,您可以使用: var fnAbc = function(){this.test = ""}
2021-04-28 23:49:03
大写字母不会改变函数的内部工作原理。这只是程序员通常通过这种方式传达意义的事情。换句话说:这不是技术问题,而是人与人之间的交流问题。
2021-05-12 23:49:03
我在 AngularJS 提供程序上遇到了这个错误,因此方法名称应该是大写的,而我的方法名是小写的。固定的。
2021-05-19 23:49:03

如果将函数声明为变量而不是使用标准函数声明,则 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);
};

如果您正在尝试实现一个方法,您可能希望改为分配给原型:

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

JSHint 不会在分配函数时发出警告。

还是不够好。ClassName.prototype.myMethod = myMethod;,然后定义下面的方法。即使正确绑定了 myMethod,您仍然会收到错误消息。
2021-05-17 23:49:03