100

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

我有这个代码:

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

4 回答 4

125

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);
}
于 2011-10-07T14:45:29.810 回答
94

我收到此消息的函数不是以大写字母开头。

"use strict";

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


// ---> just fine (note the capital S in Something)
function Something() {
    this.test = "";
}
于 2014-11-25T01:28:10.413 回答
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);
};
于 2015-04-27T17:25:40.400 回答
0

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

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

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

于 2015-08-14T16:16:35.487 回答