Pertanyaan Apa tujuan dari kata kunci var dan kapan saya harus menggunakannya (atau mengabaikannya)?


CATATAN: Pertanyaan ini ditanyakan dari sudut pandang ECMAScript versi 3 atau 5. Jawabannya mungkin menjadi ketinggalan jaman dengan diperkenalkannya fitur baru dalam rilis ECMAScript 6.


1389
2017-09-24 08:54


asal


Jawaban:


Jika Anda berada di lingkup global, maka tidak ada perbedaan.

Jika Anda dalam fungsi itu var akan membuat variabel lokal, "no var" akan mencari lingkup rantai hingga menemukan variabel atau menyentuh lingkup global (pada titik mana ia akan membuatnya):

// These are both globals
var foo = 1;
bar = 2;

function()
{
    var foo = 1; // Local
    bar = 2;     // Global

    // Execute an anonymous function
    (function()
    {
        var wibble = 1; // Local
        foo = 2; // Inherits from scope above (creating a closure)
        moo = 3; // Global
    }())
}

Jika Anda tidak melakukan tugas maka Anda perlu menggunakannya var:

var x; // Declare x

1254
2017-09-24 08:55



Ada perbedaan.

var x = 1  menyatakan variabel  x dalam lingkup saat ini (alias konteks eksekusi). Jika deklarasi muncul dalam fungsi - variabel lokal dideklarasikan; jika dalam lingkup global - variabel global dinyatakan.

x = 1, di sisi lain, hanyalah sebuah penugasan properti. Ini pertama kali mencoba untuk menyelesaikan x terhadap rantai lingkup. Jika ditemukan di mana saja dalam rantai lingkup itu, ia melakukan penugasan; jika tidak ditemukan x, hanya kemudian itu menciptakan x properti pada objek global (yang merupakan objek tingkat teratas dalam rantai lingkup).

Sekarang, perhatikan bahwa ia tidak menyatakan variabel global, ia menciptakan properti global.

Perbedaan antara keduanya halus dan mungkin membingungkan kecuali Anda mengerti itu deklarasi variabel juga membuat properti (hanya pada Objek Variabel) dan bahwa setiap properti di Javascript (baik, ECMAScript) memiliki bendera tertentu yang menggambarkan properti mereka - ReadOnly, DontEnum dan DontDelete.

Sejak deklarasi variabel menciptakan properti dengan bendera DontDelete, perbedaan antara var x = 1 dan x = 1 (Ketika dieksekusi dalam lingkup global) adalah bahwa mantan satu - variabel deklarasi - menciptakan properti DontDelete'able, dan yang terakhir tidak. Sebagai akibatnya, properti yang dibuat melalui penetapan implisit ini kemudian dapat dihapus dari objek global, dan yang pertama - yang dibuat melalui deklarasi variabel - tidak dapat dihapus.

Tapi ini hanya teori saja, dan dalam prakteknya ada lebih banyak perbedaan di antara keduanya, karena berbagai bug dalam implementasi (seperti yang dari IE).

Semoga semuanya masuk akal :)


[Perbarui 2010/12/16]

Dalam ES5 (ECMAScript 5; edisi bahasa baru-baru ini, edisi ke-5) ada yang disebut "mode ketat" - sebuah mode bahasa opt-in, yang sedikit mengubah perilaku tugas yang tidak dideklarasikan. Dalam mode ketat, penugasan ke pengenal yang dideklarasikan adalah a ReferenceError. Dasar pemikiran untuk ini adalah untuk menangkap penugasan yang tidak disengaja, mencegah penciptaan properti global yang tidak diinginkan. Beberapa peramban yang lebih baru telah mulai menggulirkan dukungan untuk mode ketat. Lihat, misalnya, tabel compat saya.


695
2017-09-24 13:38



Mengatakan itu perbedaan antara "lokal dan global"Tidak sepenuhnya akurat.

Mungkin lebih baik menganggapnya sebagai perbedaan antara "lokal dan terdekat". Yang terdekat pasti bisa global, tapi itu tidak akan selalu terjadi.

/* global scope */
var local = true;
var global = true;

function outer() {
    /* local scope */
    var local = true;
    var global = false;

    /* nearest scope = outer */
    local = !global;

    function inner() {
        /* nearest scope = outer */
        local = false;
        global = false;

        /* nearest scope = undefined */
        /* defaults to defining a global */
        public = global;
    }
}

130
2017-09-24 09:50



Ketika Javascript dijalankan di browser, semua kode Anda dikelilingi oleh pernyataan dengan, seperti:

with (window) {
    //Your code
}

Info lebih lanjut tentang with - MDN

Sejak var mendeklarasikan variabel dalam lingkup saat ini , tidak ada perbedaan antara mendeklarasikan var  di dalam jendela dan tidak menyatakannya sama sekali.

Perbedaannya muncul ketika Anda tidak langsung di dalam jendela, misalnya di dalam fungsi atau di dalam blok.

Menggunakan var memungkinkan Anda menyembunyikan variabel eksternal yang memiliki nama yang sama. Dengan cara ini Anda dapat mensimulasikan variabel "pribadi", tetapi itu adalah topik yang lain.

Aturan praktisnya adalah selalu digunakan var, karena jika tidak, Anda menjalankan risiko memperkenalkan bug halus.

EDIT: Setelah kritik yang saya terima, saya ingin menekankan hal-hal berikut:

  • var mendeklarasikan variabel dalam lingkup saat ini
  • Ruang lingkup global window
  • Tidak menggunakan var secara implisit menyatakan var dalam lingkup global (jendela)
  • Mendeklarasikan variabel dalam lingkup global (jendela) menggunakan var sama dengan menghilangkannya.
  • Mendeklarasikan variabel dalam cakupan berbeda dari jendela menggunakan var  bukan hal yang sama sebagai mendeklarasikan variabel tanpa var
  • Selalu nyatakan var secara eksplisit karena itu praktik yang baik

76
2017-09-24 09:17



Kamu harus selalu menggunakan var kata kunci untuk mendeklarasikan variabel. Mengapa? Praktik pengkodean yang baik harus cukup dari alasan itu sendiri, tetapi mendeklarasikan variabel tanpa var kata kunci berarti itu dideklarasikan di global ruang lingkup (variabel seperti ini disebut "tersirat" global). Douglas Crockford merekomendasikan tidak pernah menggunakan global tersirat, dan menurut Pedoman Coding JavaScript Apple:

Setiap variabel yang dibuat tanpa var   kata kunci dibuat di lingkup global   dan bukan sampah yang dikumpulkan saat itu   fungsi kembali (karena tidak   keluar dari ruang lingkup), menyajikan   kesempatan untuk kebocoran memori.

Jadi, singkatnya, selalu mendeklarasikan variabel menggunakan var kata kunci.


37
2017-09-24 09:52



Berikut ini contoh yang bagus tentang bagaimana Anda bisa keluar dari tidak mendeklarasikan variabel lokal dengan var:

<script>
one();

function one()
{
    for (i = 0;i < 10;i++)
    {
        two();
        alert(i);
    }
}

function two()
{
    i = 1;
}
</script>

(i disetel ulang pada setiap iterasi loop, karena tidak dideklarasikan secara lokal di for loop tetapi secara global) akhirnya menghasilkan loop tak terbatas


27
2017-09-24 09:31



Saya akan mengatakan lebih baik untuk digunakan var dalam banyak situasi.

Variabel lokal selalu lebih cepat daripada variabel dalam lingkup global.

Jika Anda tidak menggunakannya var untuk mendeklarasikan variabel, variabel akan berada dalam lingkup global.

Untuk informasi lebih lanjut, Anda dapat mencari "lingkup rantai JavaScript" di Google.


12
2017-09-24 09:02



perbedaan lain misalnya

var a = a || [] ; // works 

sementara

a = a || [] ; // a is undefined error.

8
2017-08-09 22:11