Acho que pode ser uma duplicata de Violação Estrita usando essa palavra-chave e revelando o padrão do módulo
Eu tenho este código:
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);
}
E JSHINT (JSLINT) está reclamando. Diz "Violação estrita". para a linha destacada:
Meu uso Function.call()
e a referência à instância são de alguma forma inadequados?
Isso é considerado um estilo ruim?
javascript
jslint
strict
jshint
Cheeso
fonte
fonte
this
. Não tenho ideia de por que JSLint chamaria de Violação Estrita, mas sei que se você não definir othis
valor de uma função, ela estaráundefined
no modo estrito. Claramente você está definindothis
, então não deve ser um problema."-W040":true
no config json, mas como o json não tem comentários, você não pode dizer a ninguém por que ele está lá.Respostas:
JSHint diz "Possível violação estrita" porque você está usando
this
dentro de algo que, até onde sabemos, não é um método.No modo não estrito, a chamada
gotoPage(5)
seria vinculadathis
ao objeto global (window
no navegador). No modo estrito,this
estariaundefined
, e você teria problemas.Presumivelmente, você quer chamar essa função com um
this
contexto vinculado , por exemplo,gotoPage.bind(myObj)(5)
ougotoPage.call(myObj, 5)
. Nesse caso, você pode ignorar JSHint, pois não gerará nenhum erro. Mas, está dizendo a você que seu código não está claro para quem o lê, porque usarthis
dentro de algo que não é obviamente um método é bastante confuso. Seria melhor simplesmente passar o objeto como parâmetro:fonte
this
que acabe sendoundefined
, o problema real não é apenas uma violação de modo estrito . Eles fariam melhor em dar um aviso dizendo quethis
pode estarundefined
no "modo estrito", levando a umTypeError
(ou algo).event.currentTarget
vez dethis
..jshintrc
para desabilitar essa verificação?/* jshint validthis: true */
se você tiver apenas um casal e não quiser mudar para todos os casos.Recebi esta mensagem para uma função que não começava com letra maiúscula.
fonte
Something
é um construtor devido ao S maiúsculo e, portanto, deve ser chamado comnew
. Fazer isso definethis
ser um novo objeto baseado em `Something.prototype '. Provavelmente, devido a essa suposição, ela não gera o possível aviso de violação estrito.Se você declarar a função como uma variável em vez de usar a declaração de função padrão, jshint não sinalizará isso como uma violação estrita. Então você pode fazer o seguinte -
fonte
Se estiver tentando implementar um método, você pode atribuir ao protótipo:
JSHint não avisará quando a função estiver sendo atribuída.
fonte
ClassName.prototype.myMethod = myMethod;
e definiu o método abaixo. Você ainda receberá um erro, embora myMethod esteja corretamente vinculado.