JSHINT neden bunun katı bir ihlal olduğundan şikayet ediyor?


98

Bunun, bu anahtar kelimeyi kullanan ve modül modelini açığa çıkaran Katı İhlalin bir kopyası olabileceğini düşünüyorum

Bu koda sahibim:

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

Ve JSHINT (JSLINT) şikayet ediyor. "Kesin ihlal" yazıyor. vurgulanan çizgi için:

görüntü açıklamasını buraya girin

Örneği kullanmam Function.call()ve sonra buna atıfta bulunmam bir şekilde uygunsuz mu?

Bu kötü bir tarz olarak kabul edilir mi?


Herhangi bir ayrıntılı hata mesajı olmadan sadece "Kesin ihlal" mi yazıyor?
stivlo

Sorunu yeniden oluşturamıyorum, kodu JSHint ve JSLint üzerinden çalıştırdım ve hiçbir şeyden şikayetçi görünmüyor.
Peter Olson

54
Bunu saçma sapan bir tek satıra sıkıştırmaya çalışmazsanız, teşhis etmenin çok daha kolay olacağını unutmayın: P.
Domenic

1
Bunu başka bir soruda gördüm (şu anda bulamıyorum). Kullanımıyla ilgisi var this. JSLint'in neden Katı İhlal olarak adlandırdığı konusunda hiçbir fikrim yok, ancak thisbir işlevin değerini tanımlamazsanız, undefinedkatı modda olacağını biliyorum . Açıkça siz tanımlıyorsunuz this, bu yüzden sorun olmamalı.
user113716

2
Config json ile bu olası katı ihlalleri göz ardı edebilirsiniz "-W040":true, ancak json'un yorumları olmadığı için, neden orada olduğunu kimseye söyleyemezsiniz.
kojiro

Yanıtlar:


124

JSHint, "Olası katı ihlal" diyor çünkü thisanlayabildiği kadarıyla bir yöntem olmayan bir şeyin içinde kullanıyorsunuz .

Katı olmayan modda, çağrı genel nesneye ( tarayıcıda) gotoPage(5)bağlanır . Katı modda, olur ve başınız belaya girer.thiswindowthisundefined

Muhtemelen, bu işlevi bağlı bir thisbağlamla çağırmak istiyorsunuz , örneğin gotoPage.bind(myObj)(5)veya gotoPage.call(myObj, 5). Öyleyse, herhangi bir hata oluşturmayacağınız için JSHint'i yok sayabilirsiniz. Ancak, size kodunuzun onu okuyan biri için net olmadığını söylüyor, çünkü thisaçıkça bir yöntem olmayan bir şeyin içini kullanmak oldukça kafa karıştırıcı. Nesneyi bir parametre olarak basitçe iletmek daha iyi olacaktır:

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

12
Öyle bile olsa, açıklamada biraz yanıltıcı olduklarını düşünüyorum. Bile thisolmak kadar biter undefined, o zaman gerçek sorun sadece değil katı mod ihlali. Bir (veya başka bir şeye) yol açan "katı modda" thisolabileceğine dair bir uyarı vermeleri daha iyi olur . undefinedTypeError
user113716

11
@ ripper234 gerçekten, bu yüzden her zaman event.currentTargetyerine kullanıyorum this.
Domenic

4
.jshintrcBu denetimi devre dışı bırakmak için hangi yapılandırma yönergesini ekleyebilirim ?
callum

7
@callum "validthis": doğru
Brett

18
Kullanım /* jshint validthis: true */yalnızca bir çift var ve her vaka için değişikliğe istemiyorsanız.
bilinenasilya

93

Büyük harfle başlamayan bir işlev için bu mesajı aldım.

"use strict";

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


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

28
Jshint'in, büyük olasılıkla, büyük olasılıkla Something, büyük S nedeniyle bir kurucu olduğunu varsaydığını ve bu yüzden using çağrılması gerektiğini not ediyorum new. Bunu yapmak this, "Something.prototype" a dayalı yeni bir nesne olmayı tanımlar . Muhtemelen, olası katı ihlal uyarısını gündeme getirmediği varsayımından kaynaklanmaktadır.
Andy Merts

4
Bir AngularJS sağlayıcısında bu hatayı yaşadım, bu nedenle büyük deve-durum yöntemi isimleri bekleniyor ve daha düşük deve-durumu vardı. Sabit.
Deminetix

Sadece küçük harfli bir işlev ismine sahipken, Capital kullanarak yeniden adlandırırken benzer bir problem yaşadım.
GibboK

İlk harfi büyük kullanmayın çünkü o aynı zamanda bir kurucu, başka bir sorunla karşılaşacaksınız. bunun yerine şunu kullanabilirsiniz: var fnAbc = function () {this.test = ""}
Hieu Tran AGI

Büyük harf, fonksiyonun iç işleyişiyle ilgili hiçbir şeyi değiştirmez. Bu, programcıların genellikle anlamı iletmek için bu şekilde yaptığı bir şeydir. Başka bir deyişle: bu teknolojik bir sorun değil, insanlar arasındaki iletişim sorunudur.
amenthes

9

Standart işlev bildirimini kullanmak yerine işlevi bir değişken olarak bildirirseniz, jshint bunu katı bir ihlal olarak işaretlemeyecektir. Yani aşağıdakileri yapabilirsiniz -

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

Bir yöntem uygulamaya çalışıyorsanız, bunun yerine prototipe atamak isteyebilirsiniz:

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

JSHint, işlev atanırken uyarmaz.


Hala yeterince iyi değil. ClassName.prototype.myMethod = myMethod;, ardından aşağıdaki yöntemi tanımladık. MyMethod doğru bir şekilde bağlanmış olsa bile hala bir hata alıyorsunuz.
Jefftopia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.