2011-10-07 43 views
95

我想这可能是Strict Violation using this keyword and revealing module pattern为什么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); 
} 

而且JSHINT(JSLint的)抱怨。它说“严格违规”。突出显示线路:

enter image description here

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

难道这被认为是坏的风格?

+0

是否只说“严格侵犯”,没有任何详细的错误信息? – stivlo

+0

我无法重现这个问题,我通过JSHint和JSLint运行代码,它似乎并没有抱怨任何事情。 –

+50

请注意,如果您不试图将其填充到一个荒谬的单行内容中,这将更容易诊断:P。 – Domenic

回答

121

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

您的抱怨可能是正确的,即函数没有被明确地定义为方法。尽管JSLint/Hint称它为“严格违规”*似乎很愚蠢。 – user113716

+0

在Web界面和最新版本中,它将其称为“_possible_严重违规”。 – Domenic

+12

即便如此,我认为他们在描述中有点误导。即使'this'确实最终是undefined,那么* actual *问题不仅仅是严格模式违规。在“严格模式”下,他们最好给出警告说'this'可能是'undefined',导致TypeError(或某物)。 – user113716

91

我已经有了一个函数没有以大写字母开头的消息。

"use strict"; 

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


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

我会注意到,根据约定,jshint可能会假设由于大写字母S,“Something”是构造函数,并且所以应该使用'new'来调用。这样做将'this'定义为基于'Something.prototype'的新对象。这很可能是由于这样的假设,它没有提出可能的严格违规警告。 –

+4

我在AngularJS提供程序上发生了这个错误,因此预计会出现大写骆驼的方法名称,并且我的骆驼大小较低。固定。 – Deminetix

+0

我有类似的问题,当只有一个函数名称小写,重命名使用资本。 – GibboK

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不会报警时功能被分配。

+0

还不够好。 'ClassName.prototype.myMethod = myMethod;',然后定义下面的方法。即使myMethod绑定正确,仍然会出现错误。 – Jefftopia

相关问题