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

Che*_*eso 97 javascript jslint strict jshint

我认为这可能是使用此关键字和显示模块模式严格违规的重复

我有这个代码:

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()然后引用实例,不知何故不合适?

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

Dom*_*nic 124

JSHint说"可能严格违规",因为你在this内部使用的东西,据他所知,不是一种方法.

在非严格模式下,调用gotoPage(5)将绑定this到全局对象(window在浏览器中).在严格模式下,thisundefined的,你会惹上麻烦.

据推测,您的意思是使用绑定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);
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`/*jshint validthis:true*/`如果你只有一对,并且不想为每种情况都改变. (18认同)
  • 即便如此,我认为他们在描述中有点误导.即使`this`最终成为'undefined`,那么*actual*问题也不仅仅是*严格模式*违规.当他们处于"严格模式"时,他们会更好地发出警告说"this"可能是"未定义",导致"TypeError"(或其他). (12认同)
  • @ ripper234确实,这就是为什么我总是使用`event.currentTarget`而不是`this`. (11认同)
  • @callum"validthis":是的 (7认同)
  • 我可以在`.jshintrc`中添加什么配置指令来禁用此检查? (4认同)
  • 非常好的解释(+1)."_简单地将对象作为参数传递会更好",这一建议确实提高了代码质量. (3认同)
  • 你的抱怨可能是正确的,因为函数没有明确定义*作为一种方法.看起来愚蠢的JSLint/Hint称之为*"严格违规"*. (2认同)

ame*_*hes 93

我已经有了这个消息,这个函数不是以大写字母开头的.

"use strict";

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


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

  • 我会注意到jshint可能假设,由于惯例,由于大写S,`Something`是一个构造函数,因此应该使用`new`调用.这样做将`this`定义为基于`Something.prototype'的新对象.这很可能是因为它没有提出可能的严格违规警告. (28认同)
  • 我在AngularJS提供程序上遇到此错误,因此需要使用upper-camel-case方法名称,并且我有较低的camel-case.固定. (4认同)

asu*_*man 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);
};
Run Code Online (Sandbox Code Playgroud)