我认为这可能与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)正在抱怨。它说“严格违规”。突出显示的行:
我是否使用Function.call()
然后引用该实例,不知何故不合适?
这被认为是不好的风格吗?
答案 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不会发出警告。