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

时间:2011-10-07 14:36:07

标签: javascript jslint strict jshint

  

我认为这可能与Strict Violation using this keyword and revealing module pattern

重复

我有这段代码:

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)正在抱怨。它说“严格违规”。突出显示的行:

enter image description here

我是否使用Function.call()然后引用该实例,不知何故不合适?

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

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:93)

对于没有以大写字母开头的函数,我收到了此消息。

"use strict";

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


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

答案 2 :(得分: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);
};

答案 3 :(得分:0)

如果您正在尝试实施某个方法,则可能需要分配给原型:

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

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