Pertanyaan Kesalahan JSLint: Pindahkan semua deklarasi 'var' ke bagian atas fungsi


Situs JSLint diperbarui, dan saya tidak dapat memeriksa skrip JS lagi. Bagi saya, peringatan ini tidak kritis, dan saya tidak ingin melalui ribuan baris untuk memperbaiki ini, saya ingin menemukan masalah yang lebih penting.

Apakah ada yang tahu cara mematikan kesalahan ini, atau menggunakan JSLint warisan?

MEMPERBARUI

Contoh:

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

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

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

keluaran jslint.com:

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).

Masalah:

Memiliki variabel di atas fungsi adalah persyaratan baru. Saya tidak dapat menggunakan JSLINT untuk menguji kode, karena berhenti memindai skrip pada kesalahan ini.

Saya memiliki banyak kode, dan tidak ingin mengancam peringatan ini sebagai kesalahan kritis.

UPDATE 8/22/2011: ditemukan http://jshint.com, terlihat jauh lebih baik daripada http://jslint.com/


76
2018-01-10 11:45


asal


Jawaban:


Perbarui Juni, 2017: Tunduk pada dukungan (mis. Jika Anda tidak menjalankan JavaScript di Internet Explorer 10 atau lebih rendah), Anda harus melihat menggunakan membiarkan dari pada var.

Sebagai contoh: for(let i=0; ...; i++)


Tidak mungkin saya akan menaruh var i; dari for(var i=0; ...; i++) di bagian atas fungsi saya. Terutama ketika Spesifikasi JavaScript memilikinya sebagai sintaks yang dapat diterima di for bagian (12.6). Juga, ini sintaksnya Brendan Eich menggunakan dalam contohnya.

Gagasan untuk memindahkan deklarasi ke atas adalah bahwa ia seharusnya lebih akurat merefleksikan apa yang terjadi di bawah kap, namun, melakukannya hanya akan mencerminkan, bukan memengaruhi.

Bagi saya, ini adalah harapan yang konyol untuk for iterasi. Lebih lagi karena JSLint berhenti memproses ketika mendeteksi itu.

Apakah memiliki variabel yang dinyatakan di bagian atas fungsi lebih mudah diperdebatkan. Saya pribadi lebih suka variabel iterator yang akan dideklarasikan ketika mereka digunakan. Saya tidak peduli jika variabel sudah dibuat secara internal, saya memulainya di sini jadi saya aman.

Saya berpendapat bahwa mendeklarasikan variabel iterator di mana mereka digunakan memastikan mereka tidak secara tidak sengaja dibuat global (jika Anda memindahkan loop keluar ke fungsi lain, variabel iterator bergerak dengannya). Ini jauh lebih mudah dipertahankan daripada harus mempertahankan deklarasi variabel di bagian atas fungsi.

Untuk saat ini, saya menggunakan http://www.javascriptlint.com/online_lint.php karena sepertinya fokus pada hal-hal penting.


149
2018-06-20 13:12



Compiler Google Closure benar-benar gagal mendeteksi tipe loop variabel dari ... untuk loop kecuali dinyatakan seperti untuk (var i in ...) dan tidak ada anotasi yang tampaknya memperbaiki ini, jadi deklarasi tidak dapat dipindahkan ke atas.


7
2018-06-30 15:18



Kamu bisa mengunduh versi lama kapan saja, atau memodifikasi versi terbaru. Tidak sesulit itu, sungguh (cari move_var). Kemudian jalankan jslint secara lokal, baik menggunakan node, atau menggunakan browser dengan bentuk HTML sederhana - Anda mungkin ingin menyalin asli Crockford.

Perhatikan bahwa peringatan itu diperkenalkan sebagai bagian dari penulisan ulang utama, dan hanya terjadi setelah for(, jadi pesannya sedikit menyesatkan.


5
2018-02-01 23:11



Perhatikan bahwa memindahkan semua vars ke atas berbeda dari "izinkan satu pernyataan var per fungsi". Persyaratan untuk memindahkan semua variabel ke atas baru dan tampaknya tidak memiliki tombol. Lebih lanjut di http://groups.google.com/group/jsmentors/browse_thread/thread/5e90c25230f8e22/70e1a95a20fb829e


4
2018-02-01 21:46



Saya memiliki masalah ini pada basis kode saya, ketika kami ingin beralih ke versi terbaru JSLINT. Kami memiliki banyak dari mereka dan orang-orang tidak senang menggerakkan deklarasi. Kami benar-benar menemukan solusi yang paling elegan adalah menggunakan underscore.js dan alih-alih memiliki loop verbose penuh, untuk menggunakan fungsi _.each (), yang menghapus kesalahan JSLint dan membuat kode kami lebih fungsional, lebih bersih, lebih ketat dan lebih mudah untuk Baca baca.


3
2017-08-29 10:22



Meskipun demikian baru beta JSLint tidak mendokumentasikan perintah komentar untuk beberapa var toleransi dalam suatu fungsi, itu tidak muncul untuk mendukung arahan dari versi aslinya.

Asli JSLint memungkinkan Anda melakukan ini:

/*jslint vars: true */

Menurut pengalaman saya, ini masih berfungsi — saya rasa kompatibilitas ke belakang. Saat penulisan ini adalah Juni 2015.


1
2018-06-09 23:02



Saya menemukan bahwa sintaks berikut akan mendapatkan kesalahan dihapus:

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