Soru JSLint hatası: Tüm 'var' bildirimlerini işlevin en üstüne taşı


JSLint sitesi güncellendi ve artık JS komut dosyalarını kontrol edemiyorum. Benim için bu uyarı kritik değil ve bunu düzeltmek için binlerce satırdan geçmek istemiyorum, daha önemli sorunları bulmak istiyorum.

Bu hatayı nasıl kapatacağını veya eski JSLint'i nasıl kullanacağını bilen var mı?

GÜNCELLEŞTİRME

Örnek:

function doSomethingWithNodes(nodes){
  this.doSomething();

  for (var i = 0; i < nodes.length; ++i){
    this.doSomethingElse(nodes[i]);
  }

  doSomething(); // want to find this problem
}

jslint.com çıkışı:

Error:
Problem at line 4 character 8: Move all 'var' declarations to the top of the function.

for (var i = 0; i < nodes.length; ++i){

Problem at line 4 character 8: Stopping, unable to continue. (44% scanned).

Sorun:

İşlevlerin üst kısmında değişkenlere sahip olmak yeni gereksinimdir. Kodu sınamak için JSLINT kullanamıyorum, çünkü bu hata kod dosyasını taramayı durdurur.

Çok fazla kodum var ve bu uyarıyı kritik hata olarak tehdit etmek istemiyorum.

UPDATE 8/22/2011: bulundu http://jshint.comçok daha iyi görünüyor http://jslint.com/


76
2018-01-10 11:45


Menşei


Sorunuzu açıklayabilir misiniz? Aslında iki soruya cevap veriyor musunuz? - James Wiseman
Eğer hata yaparsanız hala ilk hatada durur mu? Stop on first error? - david
@david Benim için evet. - Paul Beusterien
Bu site daha iyi iş yapacak -> glat.info/jscheck - vsync
JSHint iyi bir seçimdir. - Ben Roberts


Cevaplar:


Haziran 2017'yi güncelleyin: Desteklenmeye tabi (örneğin, Internet Explorer 10'da veya altında JavaScript'i çalıştırmıyorsanız), kullanmaya bakmanız gerekir. let yerine var.

Örneğin: for(let i=0; ...; i++)


Hiçbir şekilde koymayacağım var i; bir for(var i=0; ...; i++) işlevlerimin üstünde. Özellikle ne zaman JavaScript Özellikleri içinde kabul edilebilir bir sözdizimi var for bölüm (12.6). Ayrıca, bu sözdizimi Brendan Eich onun örneklerinde kullanır.

Beyanı en üste taşımak fikri, başlığın altında ne olduğunu daha doğru bir şekilde yansıtması gerektiğidir, ancak bunu yapmak yalnızca yansıtacak, etkilemeyecektir.

Benim için bu saçma bir beklenti for yineleme. Dahası, JSLint bunu algıladığında işlemeyi durdurur.

Bir fonksiyonun üstünde bildirilen değişkenlerin daha okunabilir olup olmadığı tartışmalıdır. Şahsen ben kullanıldığında iterator değişkenlerinin beyan edilmesini tercih ederim. Değişkenin dahili olarak yaratılmış olması umurumda değil, ben burada başlatıyorum, bu yüzden güvendeyim.

Kullanılan bir yineleyici değişkeni ilan etmenin, yanlışlıkla global olarak yapılmadıklarını (döngüyi başka bir işleve taşıdığınızda, yineleyici değişkeninin onunla birlikte hareket etmesini) sağladığını iddia ediyorum. Bu, işlevlerin üst kısmında değişken bildirimleri bulundurmaktan çok daha sürdürülebilir.

Şimdilik kullanıyorum http://www.javascriptlint.com/online_lint.php çünkü önemli şeylere odaklanmış görünüyor.


149
2018-06-20 13:12



Ayrıca, JSLint'teki bu gibi konulara kısmen yanıt olarak oluşturulan JSHint'e de göz atın. Ve bu tartışmaya bakın: stackoverflow.com/questions/6803305/... - Ben Roberts
İşaret ettiğin için teşekkürler javascriptlint.com/online_lint.php. JSLint'i kullanıyordum, ancak JSLint'teki hatalar bile olmayan hatalar hakkındaki tüm anlamsız hareketlerden kurtulmak zor.
Size katılmıyorum ama javascript'in sadece işlev kapsamı olduğunu belirtmek önemlidir. For döngüsünde blok kapsamı yoktur. Bu nedenle değişken olsa bile i içinde tanımlanır for(var i=0; i<10; i+=1) tüm işlev için mevcut olacak ve başlatma sırasında en üstte kaldırılacaktır. JSLint sözdizimsel olarak doğrudur, ancak bu durumda, kurala göre hiç kimse bu şekilde kodlamaz. - mastaBlasta
NVM tamamen haklısın. Bir fonksiyonda iki döngü olsaydı ne olacağını görmek için test ediyordum for(var i=0; i<5; i+=1)eğer derleyici atarsa variable already defined uyarı, ama yapmadı! Katı modda bile, bir değişkenin yeniden bildirilmesi hiçbir uyarı veya hata atmadı. Öyleyse evet, JSLint yanlış. - mastaBlasta
@Zon: veya sadece kullan i Yine herhangi bir akılcı geliştirici gibi olurdu. Nerede ilan ettiğin önemli değil var i, yeniden kullanım izin verilir. - Lee Kowalkowski


Google Closure derleyici aslında bir döngü için bir döngü değişkeninin türünü doğru bir şekilde algılayamaz ... (örneğin, ...) gibi bildirilmezse ve hiçbir açıklama bu düzeltmeyi desteklemiyorsa, bu nedenle bildirim taşınamaz Başa.


7
2018-06-30 15:18



Gerçekten?! Bu yazık, ama paylaşmak gerçekten yararlı, +1. - Lee Kowalkowski
@jjrv kapatma derleyici ile çalışmayan bir kod örneğiniz var mı? Ben kullanıyorum ve herhangi bir sorun görmedim. - JavaKungFu
@JavaKungFu'nun belirtisi, derleyicinin% 100'den az yazılan kodu rapor etmesi ve CompilerOptions.java'da reportUnknownTypes = CheckLevel.WARNING değerini ayarlarsanız bir uyarı göstermesidir. - jjrv
Tamam, cevabını yanlış anladım, derlenmiş kodda bir sorun yarattığını düşündüm. Teşekkürler. - JavaKungFu


İndirebilirsin eski versiyonlar herhangi bir zamanda veya değiştirmek en son versiyon. O kadar da zor değil, move_var). Daha sonra jslint'i yerel olarak ya düğüm kullanarak ya da basit bir HTML formuna sahip bir tarayıcı kullanarak çalıştırın - Crockford'un orijinalini kopyalamak isteyebilirsiniz.

Uyarının bir parçası olarak verildiğini unutmayın. büyük yeniden yazmave sadece sonra for(Bu yüzden mesaj biraz yanıltıcıdır.


5
2018-02-01 23:11





Tüm varyasyonların üst tarafa taşınmasının "işlev başına bir varyasyona izin ver" seçeneğinden farklı olduğunu unutmayın. Tüm değişkenleri en üste taşımak gereksinimi yenidir ve bir geçişe sahip değildir. Daha fazla http://groups.google.com/group/jsmentors/browse_thread/thread/5e90c25230f8e22/70e1a95a20fb829e


4
2018-02-01 21:46





JSLINT'in en son sürümüne geçmek istediğimizde, bu sorun benim codebase'imde vardı. Bunların birçoğunu aldık ve insanlar bildirgeyi taşımaktan memnun değillerdi. Aslında en zarif çözüm, underscore.js'yi kullanmak ve tam bir ayrıntılı döngüye sahip olmak yerine, JSLint hatasını kaldıran ve bizim kodumuzu daha işlevsel, daha temiz, daha sıkı ve daha kolay hale getiren _.each () işlevini kullanmak yerine bulduğumuzu buldu. okuyun.


3
2017-08-29 10:22



Lodash kullanıyorum ama harika bir nokta. - Shanimal


Her ne kadar yeni beta JSLint çoklu için yorum yönergesini belgelemiyor var bir işlev içinde tolerans yapar Orijinal versiyondan direktifleri destekliyor görünmektedir.

Orijinal JSLint Bunu yapmanıza izin verdi:

/*jslint vars: true */

Benim tecrübemde bu hala çalışıyor - geriye dönük uyumluluk için varsayalım. Bu yazının saati Haziran 2015.


1
2018-06-09 23:02





Aşağıdaki sözdiziminin kaldırılan hatayı alacağını buldum:

function doSomethingWithNodes(nodes) {
    this.doSomething();
    var i; // HERE is where you move the 'var' to the top of the function
    for (i = 0; i < nodes.length; ++i) {
        this.doSomethingElse(nodes[i]);
    }

    doSomething(); // want to find this problem
}

0
2018-04-29 03:15