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

1543

CATATAN : Pertanyaan ini ditanyakan dari sudut pandang ECMAScript versi 3 atau 5. Jawabannya mungkin menjadi usang dengan pengenalan fitur-fitur baru dalam rilis ECMAScript 6.

Apa sebenarnya fungsi varkata kunci dalam JavaScript, dan apa perbedaannya

var someNumber = 2;
var someFunction = function() { doSomething; }
var someObject = { }
var someObject.someProperty = 5;

dan

someNumber = 2;
someFunction = function() { doSomething; }
someObject = { }
someObject.someProperty = 5;

?

Kapan Anda akan menggunakan salah satunya, dan mengapa / apa fungsinya?

Alex
sumber
3
Saat merantai deklarasi var, apakah menempatkan baris baru setelah koma memengaruhi perilaku? var x = 1, y = 2, [kembali] z = 3;
Alfabravo
4
Gagal menggunakan "var" juga membuat Anda terpapar jika nama variabel yang Anda pilih kebetulan merupakan variabel global yang sebelumnya ditentukan. Lihat perjalanan kesedihan saya di sini: stackoverflow.com/questions/16704014/…
Scott C Wilson
5
Posting blog meloncard @Ray Toal (pasti patut dibaca) telah pindah ke blog.safeshepherd.com/23/how-one-missing-var-ruined-our-launch
Hephaestus
Saya tidak pernah membayangkan sebuah puisi bisa mengilhami saya pertimbangan untuk masalah terprogram
Félix Gagnon-Grenier
1
@Gibolt tapi lihat tanggal pertanyaannya, ini agak tidak adil memanggil pertanyaan 2009 untuk mengatakan itu. Meskipun, itu masih berlaku seperti pada tanggal saat ini untuk pemeliharaan, ada di luar sana banyak kode "JS modern".
Andre Figueiredo

Jawaban:

1356

Jika Anda berada dalam lingkup global maka tidak ada banyak perbedaan. Baca jawaban Kangax untuk penjelasan

Jika Anda berada dalam suatu fungsi maka varakan membuat variabel lokal, "no var" akan mencari rantai lingkup sampai menemukan variabel atau mengenai 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 menggunakan var:

var x; // Declare x
Greg
sumber
31
Apakah "tidak terlalu banyak perbedaan" == "Tidak Ada Perbedaan"?
Alex
65
Yah, sebenarnya ya, ada perbedaan :) Apakah perbedaan itu penting adalah pertanyaan lain. Lihat jawaban saya lebih jauh ke bawah: stackoverflow.com/questions/1470488/…
kangax
4
Saya pikir itu mungkin poin Alex, itulah sebabnya dia menulisnya menggunakan operator "sama dengan"!
James Bedford
18
Ini seperti menembak diri sendiri dengan railgun ... Lupa menempatkan 'var' sebelum variabel seseorang, dan akhirnya memodifikasi variabel di suatu tempat dalam rantai lingkup ... Cobalah meyakinkan Java / C / Python / etc. pengembang bahwa JavaScript bermanfaat. Ha! C / C ++ perangkap terlihat bagus kontras. Bayangkan harus men-debug JavaScript ... Dan beberapa orang tentu saja melakukannya. Dan ada begitu banyak kode (dan bukan kode sederhana, ingatlah) yang ditulis dalam JavaScript ...
Albus Dumbledore
6
Jika Anda berada di lingkup global maka tidak ada perbedaan. >> ada perbedaan yang dijelaskan dalam jawaban di bawah ini
Max Koretskyi
746

Ada perbedaan .

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

x = 1, di sisi lain, hanyalah penugasan properti. Pertama kali mencoba untuk menyelesaikan xterhadap rantai ruang lingkup. Jika menemukannya di mana saja dalam rantai lingkup itu, ia melakukan tugas; jika tidak ditemukan x, barulah ia menciptakan xproperti pada objek global (yang merupakan objek tingkat atas dalam rantai lingkup).

Sekarang, perhatikan bahwa itu tidak mendeklarasikan variabel global, itu menciptakan properti global.

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

Karena deklarasi variabel membuat properti dengan flag DontDelete, perbedaan antara var x = 1dan x = 1(ketika dieksekusi dalam lingkup global) adalah bahwa deklarasi satu - variabel - menciptakan properti DontDelete'able, dan yang terakhir tidak. Sebagai akibatnya, properti yang dibuat melalui penugasan 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 praktiknya ada lebih banyak perbedaan di antara keduanya , karena berbagai bug dalam implementasi (seperti yang dari IE).

Semoga semuanya masuk akal :)


[Pembaruan 2010/12/16]

Dalam ES5 (ECMAScript 5; baru-baru ini distandarisasi, edisi ke-5 bahasa) ada yang disebut "mode ketat" - mode bahasa opt-in, yang sedikit mengubah perilaku tugas yang tidak diumumkan. Dalam mode ketat, penugasan ke pengidentifikasi yang tidak diumumkan adalah ReferenceError . Alasan untuk ini adalah untuk menangkap tugas yang tidak disengaja, mencegah penciptaan properti global yang tidak diinginkan. Beberapa browser yang lebih baru sudah mulai menggulirkan dukungan untuk mode ketat. Lihat, misalnya, tabel compat saya .

Kangax
sumber
Jika saya ingat dengan benar, saya pikir saya pernah menemukan cara untuk dapat deletemendeklarasikan variabel var dengan beberapa evalperetasan. Jika saya ingat trik tepatnya saya akan memposting di sini.
Menara
3
@Mageek Dia mungkin mengambil variabel dideklarasikan eval yang dapat dihapus. Saya menulis posting blog tentang ini sekali.
kangax
1
Sedikit keluar dari topik, tetapi menyebutkannya di sini untuk referensi. "let" sangat mirip dengan "var" dan didukung di Mozilla. Perbedaan utama adalah bahwa ruang lingkup variabel var adalah seluruh fungsi melampirkan di mana sebagai "let" dibatasi untuk bloknya
mac
@ Kangax bagaimana jika dua baris terakhir dari contoh Alex dicampur: var someObject = {}dan someObject.someProperty = 5? Akan somePropertymenjadi global, sementara objek itu adalah milik tetap lokal?
snapfractalpop
1
Nama spesifikasi untuk apa yang @kangax sebut sebagai bendera DontDelete dapat dikonfigurasi (= false) , Anda dapat membaca tentang ini sehubungan dengan Object.definePropertydanObject.getOwnPropertyDescriptor
Paul S.
137

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

Mungkin lebih baik untuk menganggapnya sebagai perbedaan antara " lokal dan terdekat ". Yang terdekat pasti bisa bersifat global, tetapi itu tidak 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;
    }
}
Jonathan Lonowski
sumber
3
Bukankah ruang lingkup terdekat outertempat Anda mendefinisikan var global = false;?
Snekse
@Snekse: 'terdekat' tidak berlaku ketika <code> var global = false; </code> dideklarasikan. Dalam deklarasi itu, 'global' ditempatkan dalam lingkup outer () karena 'var' digunakan dalam deklarasi. Karena 'var' tidak digunakan di dalam (), itu akan mengubah nilai di tingkat berikutnya, yang luar ().
Mitch
Saya ingin tahu apakah Anda berkomentar akan berubah jika Anda mengubah baris itu yang var global = local;dalam hal ini ruang lingkup terdekat dari lokal adalah ruang lingkup luar "lokal" yang secara aktif didefinisikan. Meskipun akan aneh jika Anda akan mengubah baris yang sama var global = globaldalam hal ruang lingkup terdekat saat mencari nilai globalakan naik level di ruang lingkup jendela global.
Snekse
80

Ketika Javascript dieksekusi di browser, semua kode Anda dikelilingi oleh pernyataan with, seperti:

with (window) {
    //Your code
}

Info lebih lanjut tentang with- MDN

Karena varmendeklarasikan variabel dalam cakupan saat ini , tidak ada perbedaan antara mendeklarasikan var jendela bagian dalam dan tidak mendeklarasikannya sama sekali.

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

Menggunakan varmemungkinkan Anda menyembunyikan variabel eksternal yang memiliki nama yang sama. Dengan cara ini Anda bisa mensimulasikan variabel "pribadi", tapi itu topik lain.

Aturan praktis adalah untuk selalu menggunakan var, karena jika tidak Anda berisiko memperkenalkan bug halus.

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

  • varmendeklarasikan variabel dalam cakupan saat ini
  • Lingkup global adalah window
  • Tidak menggunakan varsecara implisit menyatakan vardalam lingkup global (jendela)
  • Mendeklarasikan variabel dalam lingkup global (jendela) menggunakan varsama dengan menghilangkannya.
  • Mendeklarasikan variabel dalam lingkup yang berbeda dari menggunakan jendela var tidak sama dengan mendeklarasikan variabel tanpavar
  • Selalu menyatakan varsecara eksplisit karena itu praktik yang baik
kentaromiura
sumber
1
Saya tidak menurunkan suara Anda, tetapi ruang lingkup mungkin kata yang lebih baik daripada jendela. Anda seluruh penjelasan agak tumpul.
Robert Harvey
4
Saya cukup menyebut berbagai hal dengan nama itu, Anda ingin menyebutnya "ruang lingkup global", tidak apa-apa, tetapi sisi klien, dengan konvensi, adalah objek jendela, yang merupakan elemen terakhir dari rantai ruang lingkup, yang mengapa Anda dapat memanggil setiap fungsi dan setiap objek di jendela tanpa menulis "jendela."
kentaromiura
2
+1 ini adalah penjelasan yang sangat bagus - saya belum pernah mendengar var / no var dibingkai (tidak ada kata pun dimaksudkan) seperti ini sebelumnya.
doug
Sebagian besar jawaban ini ditinggalkan dengan letES6.
Evan Carroll
3
@ EvanCarroll Jawaban ini juga secara teknis salah karena menghilangkan var tidak mendeklarasikan variabel apa pun, melainkan membuat properti yang dapat dihapus pada objek global, selain itu dengan mode "gunakan ketat" ES5 sebagian besar jawabannya jelas tidak benar, juga biarkan tidak Bahkan tidak dipertimbangkan dalam jawaban ini karena pada saat pertanyaan tidak ada referensi ke versi javascript (ditambahkan kemarin) yang menyiratkan bahwa standar referensi (pada waktu itu) adalah ECMA 262 3rd Edition.
kentaromiura
43

Selalu gunakan varkata kunci untuk mendeklarasikan variabel. Mengapa? Praktik pengkodean yang baik seharusnya cukup menjadi alasan tersendiri, tetapi menghilangkannya berarti dideklarasikan dalam lingkup global (variabel seperti ini disebut global "tersirat"). Douglas Crockford merekomendasikan untuk tidak pernah menggunakan global tersirat , dan menurut Pedoman Pengkodean JavaScript Apple :

Variabel apa pun yang dibuat tanpa var kata kunci dibuat di lingkup global dan bukan sampah yang dikumpulkan ketika fungsi kembali (karena itu tidak keluar dari ruang lingkup), menghadirkan peluang kebocoran memori.

Steve Harrison
sumber
17
"Praktek pengkodean yang baik" seharusnya tidak menjadi alasan yang cukup dalam dirinya sendiri. Itu berjumlah "beberapa orang di internet mengatakan ini adalah bagaimana kode saya akan terlihat". Itu bahkan kurang valid daripada "kata guru saya", kecuali satu setidaknya secara samar memahami alasan di balik aturan itu.
cHao
@ cHao saya pikir good coding practiceselalu alasan yang cukup jika ini merupakan praktik terbaik yang disarankan, yang ini dan oleh beberapa penulis Javascript.
Chris S
8
@ Chris: Tidak, "praktik pengkodean yang baik" bukan alasannya sendiri. The Alasan itu dianggap praktik yang baik adalah apa yang penting. Kecuali jika para penulis itu memberi tahu Anda mengapa mereka merekomendasikannya, rekomendasi mereka tidak akan berarti apa-apa. Jika Anda tidak setuju dengan alasannya, maka Anda bebas untuk menganggapnya sebagai saran yang buruk. Dan jika Anda mengikutinya tanpa pernah bertanya mengapa, begitulah kultus kargo dimulai.
cao
30

Berikut ini adalah contoh yang cukup baik tentang bagaimana Anda bisa tertangkap karena tidak mendeklarasikan variabel lokal dengan var:

<script>
one();

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

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

( iDi-reset pada setiap iterasi dari loop, karena tidak dinyatakan secara lokal dalam forloop tetapi secara global) akhirnya menghasilkan loop tak terbatas

Chris S
sumber
Astaga! Saya bisa membayangkan semua bug yang bisa disebabkan oleh kesalahan ketik itu.
BonsaiOak
2
Saya ingin tahu, mengapa Anda memberikan saya sebagai argumen ke dua ()? (di dalam for loop) apakah itu berlebihan?
kalin
Argumen diabaikan dalam dua () fungsi dienkapsulasi dalam satu () fungsi, karena fungsi dua () didefinisikan tanpa parameter. Anda cukup benar, itu tidak diperlukan karena itu tidak memainkan peran.
KK.
Bug atau fitur?
TheMaster
13

Saya akan mengatakan itu lebih baik untuk digunakan vardalam kebanyakan situasi.

Variabel lokal selalu lebih cepat daripada variabel dalam lingkup global.

Jika Anda tidak menggunakan varuntuk mendeklarasikan variabel, variabel tersebut akan berada dalam lingkup global.

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

Billy
sumber
Jika Anda mendeklarasikan variabel dengan menggunakan kata kunci var, itu akan dibuat saat runtime jadi tidakkah seharusnya lebih lambat? Karena yang lain dibuat pada waktu diuraikan.
Barış Velioğlu
@RyuKaplan - hei, apakah itu benar? Saya mencoba googling dan tidak bisa mendapatkan info tentang masalah ini! Apakah Anda memiliki sumber otoritas untuk pernyataan itu? Thx
mike rodent
@RyuKaplan Parsing / kompilasi berbeda dari benar-benar menjalankan kode.
gcampbell
11

Jangan gunakan var!

varadalah cara pra-ES6 untuk mendeklarasikan variabel. Kami sekarang di masa depan , dan Anda harus mengkodekannya.

Gunakan constdanlet

constharus digunakan untuk 95% kasus. Itu membuatnya sehingga referensi variabel tidak dapat berubah, sehingga array, objek, dan properti DOM node dapat berubah dan seharusnya const.

letharus digunakan untuk variabel apa saja yang akan dipindahkan. Ini termasuk dalam for loop. Jika Anda pernah menulis di varName =luar inisialisasi, gunakan let.

Keduanya memiliki ruang lingkup tingkat blok, seperti yang diharapkan di sebagian besar bahasa lain.

Gibolt
sumber
2
Ganti semua yang Anda 'var' dengan 'const' (ganti semua). Anda akan dengan cepat melihat di mana variabel yang ditugaskan kembali. Jika Anda memiliki terlalu banyak dari mereka, Anda mungkin kode anti-pola: sebagian besar variabel yang dapat ditugaskan kembali dapat tertanam dalam penutupan atau sebagai properti-objek. Jika Anda memiliki beberapa: gunakan 'biarkan' untuk mereka. Akhirnya, jika beberapa variabel di mana tidak dihapus sama sekali dengan 'var', mereka akan tetap tidak dideklarasikan, dan masih ada di ruang global, waspadalah. Tentang @Gibolt komentar 'dalam loop untuk', juga dianjurkan untuk menghindari loop seperti di "95% kasus" ;-): metode array hebat
allez l'OM
Dengan mengatakan bahwa const harus digunakan dalam 95% kasus, sepertinya kita akan beralih dari praktik yang baik dan menjadi dogma.
Agamemnus
9

perbedaan lain misalnya

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

sementara

a = a || [] ; // a is undefined error.
Pranay Warke
sumber
1
Bisakah Anda menjelaskan mengapa ia bekerja jika variabel didefinisikan dengan 'var' dan variabel tidak didefinisikan dengan var? Apakah variabel dibuat sebelum evaluasi sisi kanan tugas dalam kasus var?
matt
6
@Lucek karena var adiangkat ke atas lingkup dan diatur ke nol yang menyatakan tetapi tidak menginisialisasi variabel, maka dalam penugasan Anda memiliki referensi ke variabel nol yang tidak ditentukan yang mengevaluasi ke false, dan mengatur penugasan ke []. Dalam yang terakhir, Anda memiliki tugas ke properti adari properti a. Anda dapat menugaskan ke properti yang tidak ada - membuatnya saat penugasan, tetapi Anda tidak dapat membaca dari properti yang tidak ada tanpa harus ReferenceErrordilemparkan ke arah Anda.
Evan Carroll
1
@ EvanCarroll: itu akan diangkat ke atas cakupan dan diatur ke undefined bukan null.
mithunsatheesh
8

Menggunakan varselalu merupakan ide yang baik untuk mencegah variabel mengacaukan ruang lingkup global dan variabel saling bertentangan, menyebabkan penimpaan yang tidak diinginkan.

kevinji
sumber
8

Tanpa var- variabel global.

Sangat disarankan untuk SELALU menggunakan varpernyataan, karena variabel global init dalam konteks lokal - adalah jahat. Tetapi, jika Anda membutuhkan trik kotor ini, Anda harus menulis komentar di awal halaman:

/* global: varname1, varname2... */
Anatoliy
sumber
3

Ini adalah contoh kode yang saya tulis agar Anda memahami konsep ini:

var foo = 5; 
bar = 2;     
fooba = 3;

// Execute an anonymous function
(function() {    
    bar = 100;             //overwrites global scope bar
    var foo = 4;           //a new foo variable is created in this' function's scope
    var fooba = 900;       //same as above
    document.write(foo);   //prints 4
    document.write(bar);   //prints 100
    document.write(fooba); //prints 900
})();

document.write('<br/>');
document.write('<br/>');
document.write(foo);       //prints 5
document.write(bar);       //prints 100
document.write(fooba);     //prints 3
newday
sumber
2
Fungsi ini tidak berarti "anonim". Faktanya, nama itu hampir sama dengan namanya.
Ingo Bürk
Terima kasih telah mengedit jawaban Anda, sebagai tanggapan atas komentar Ingo Bürk, untuk membuat "fungsi anonim" benar-benar anonim.
Dave Burton
3

@ Chris S memberikan contoh yang bagus menunjukkan perbedaan praktis (dan bahaya) antara vardan tidak var. Inilah yang lain, saya menemukan ini sangat berbahaya karena perbedaannya hanya terlihat di lingkungan asinkron sehingga dapat dengan mudah lolos selama pengujian.

Seperti yang Anda harapkan dari output cuplikan berikut ["text"]:

function var_fun() {
  let array = []
  array.push('text')
  return array
}

console.log(var_fun())

Begitu juga cuplikan berikut (perhatikan yang hilang letsebelumnya array):

function var_fun() {
  array = []
  array.push('text')
  return array
}

console.log(var_fun())

Menjalankan manipulasi data secara tidak sinkron masih menghasilkan hasil yang sama dengan satu pelaksana:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

var_fun().then(result => {console.log(result)})

Tetapi berperilaku berbeda dengan banyak yang:

function var_fun() {
  array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

Namun, gunakan let:

function var_fun() {
  let array = [];
  return new Promise(resolve => resolve()).then(() => {
    array.push('text')
    return array
  })
}

[1,2,3].forEach(i => {
  var_fun().then(result => {console.log(result)})
})

ini adalah desainku
sumber
Terima kasih atas contohnya @thisismydesign! Sehubungan dengan dua contoh terakhir, mengapa contoh kedua merekam log array dari 3 elemen dengan teks yang ditulis tiga kali sedangkan contoh terakhir hanya mencatat "teks" sekali per elemen dalam array? (Saya mengerti bahwa yang terakhir menyatakan "array" sebagai variabel dan karena itu berada dalam lingkup lokal, sedangkan contoh kedua dari belakang menghilangkan ini, membuat "array" menjadi bagian dari cakupan global yang tersirat.) Tetapi, mengapa bagaimana ini mempengaruhi keluaran? Apakah karena forEach "i" berganti fungsi dan semua variabel global?
AlmostPitt
2

Ketika seseorang mencoba mempelajari ini, inilah cara saya melihatnya. Contoh-contoh di atas mungkin agak terlalu rumit untuk pemula.

Jika Anda menjalankan kode ini:

var local = true;
var global = true;


function test(){
  var local = false;
  var global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

Output akan berbunyi: false, false, true, true

Karena ia melihat variabel dalam fungsi sebagai terpisah dari yang di luarnya, maka istilah variabel lokal dan ini adalah karena kami menggunakan var dalam penugasan. Jika Anda mengambil var di fungsi jadi sekarang berbunyi seperti ini:

var local = true;
var global = true;


function test(){
  local = false;
  global = false;
  console.log(local)
  console.log(global)
}

test();

console.log(local);
console.log(global);

Outputnya salah, salah, salah, salah

Ini karena alih-alih membuat variabel baru dalam lingkup atau fungsi lokal, ia hanya menggunakan variabel global dan menugaskannya menjadi false.

Danrex
sumber
2

Saya melihat orang-orang bingung ketika mendeklarasikan variabel dengan atau tanpa var dan di dalam atau di luar fungsi. Berikut adalah contoh mendalam yang akan memandu Anda melalui langkah-langkah ini:

Lihat skrip di bawah ini dalam aksi di sini di jsfiddle

a = 1;// Defined outside the function without var
var b = 1;// Defined outside the function with var
alert("Starting outside of all functions... \n \n a, b defined but c, d not defined yet: \n a:" + a + "\n b:" + b + "\n \n (If I try to show the value of the undefined c or d, console.log would throw 'Uncaught ReferenceError: c is not defined' error and script would stop running!)");

function testVar1(){
    c = 1;// Defined inside the function without var
    var d = 1;// Defined inside the function with var
    alert("Now inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 1. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};


testVar1();
alert("Run the 1. function again...");
testVar1();

function testVar2(){
    var d = 1;// Defined inside the function with var
    alert("Now inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);

    a = a + 5;
    b = b + 5;
    c = c + 5;
    d = d + 5;

    alert("After added values inside the 2. function: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n d:" + d);
};

testVar2();

alert("Now outside of all functions... \n \n Final Values: \n a:" + a + "\n b:" + b + "\n c:" + c + "\n You will not be able to see d here because then the value is requested, console.log would throw error 'Uncaught ReferenceError: d is not defined' and script would stop. \n ");
alert("**************\n Conclusion \n ************** \n \n 1. No matter declared with or without var (like a, b) if they get their value outside the function, they will preserve their value and also any other values that are added inside various functions through the script are preserved.\n 2. If the variable is declared without var inside a function (like c), it will act like the previous rule, it will preserve its value across all functions from now on. Either it got its first value in function testVar1() it still preserves the value and get additional value in function testVar2() \n 3. If the variable is declared with var inside a function only (like d in testVar1 or testVar2) it will will be undefined whenever the function ends. So it will be temporary variable in a function.");
alert("Now check console.log for the error when value d is requested next:");
alert(d);

Kesimpulan

  1. Tidak masalah dideklarasikan dengan atau tanpa var (seperti a, b) jika mereka mendapatkan nilainya di luar fungsi, mereka akan mempertahankan nilainya dan juga nilai-nilai lain yang ditambahkan di dalam berbagai fungsi melalui skrip dipertahankan.
  2. Jika variabel dideklarasikan tanpa var di dalam suatu fungsi (seperti c), ia akan bertindak seperti aturan sebelumnya, ia akan mempertahankan nilainya di semua fungsi mulai sekarang. Entah itu mendapatkan nilai pertamanya di function testVar1 () masih mempertahankan nilai dan mendapatkan nilai tambahan di function testVar2 ()
  3. Jika variabel dideklarasikan dengan var di dalam suatu fungsi saja (seperti d dalam testVar1 atau testVar2) itu akan tidak terdefinisi setiap kali fungsi berakhir. Jadi itu akan menjadi variabel sementara dalam suatu fungsi.
Tarik
sumber
Terima kasih telah meluangkan waktu untuk membuat contoh untuk menunjukkan topik ini. Kode di atas tidak ada bagian di bawah ini sehingga Anda mungkin ingin mengedit jawaban Anda: a = 1; // Ditentukan di luar fungsi tanpa var var b = 1; // Ditentukan di luar fungsi dengan var alert ("Mulai di luar semua fungsi ... \ n \ na, b didefinisikan tetapi c, d belum didefinisikan: \ na: "+ a +" \ nb: "+ b +" \ n \ n (Jika saya mencoba menunjukkan nilai dari c yang tidak terdefinisi) atau d, console.log akan menampilkan kesalahan 'Uncaught ReferenceError: c tidak didefinisikan' dan skrip akan berhenti berjalan!) ");
Sankofa
1

Di dalam kode Anda jika Anda menggunakan variabel tanpa menggunakan var, maka yang terjadi adalah var_name secara otomatis ditempatkan di lingkup global misalnya:

someFunction() {
    var a = some_value; /*a has local scope and it cannot be accessed when this
    function is not active*/
    b = a; /*here it places "var b" at top of script i.e. gives b global scope or
    uses already defined global variable b */
}
Akash Arora
sumber
1

Selain masalah cakupan, beberapa orang juga menyebutkan mengangkat , tetapi tidak ada yang memberi contoh. Inilah satu untuk lingkup global:

console.log(noErrorCase);
var noErrorCase = "you will reach that point";

console.log(runTimeError);
runTimeError = "you won't reach that point";

deathangel908
sumber
0

Tanpa menggunakan variabel "var" hanya dapat menentukan kapan menetapkan nilai. Sebagai contoh:

my_var;

tidak dapat bekerja dalam lingkup global atau dalam lingkup lain apa pun . Itu harus dengan nilai seperti:

my_var = "value";

Di sisi lain, Anda dapat mendefinisikan seperti vaiable;

var my_var;

Nilainya adalah undefined(Nilainya tidak nulldan tidak sama dengan yang nullmenarik.).

umut
sumber
my_var;sebenarnya adalah pernyataan ekspresi yang valid.
lexicore
Ini adalah pernyataan yang valid jika variabel didefinisikan sebelumnya. Kalau tidak, ia melempar kesalahan "... tidak didefinisikan".
umut
3
Ini adalah pernyataan yang valid terlepas dari apakah suatu variabel didefinisikan sebelum atau tidak. :) Pernyataan yang benar dapat membuat kesalahan atau tidak membuat pernyataan tersebut tidak valid.
lexicore
Saya bingung tentang itu. Apa pernyataan yang valid? Dan bisakah Anda memberi saya contoh pernyataan yang tidak valid?
umut
Saya harus minta maaf - terlalu banyak tata bahasa ECMAScript belakangan ini. my_var;adalah pernyataan ekspresi yang valid . /my_var;akan menjadi pernyataan yang tidak valid. Tapi seperti yang saya katakan, ini kasuistik tata bahasa, saya minta maaf, komentar saya sebenarnya tidak tepat.
lexicore
0

Anda harus menggunakan kata kunci var kecuali jika Anda ingin agar variabel dilampirkan ke objek jendela di browser. Berikut ini tautan yang menjelaskan pelingkupan dan perbedaan antara pelingkupan glokal dan pelingkupan lokal dengan dan tanpa kata kunci var.

Ketika variabel didefinisikan tanpa menggunakan kata kunci var, seperti apa itu adalah operasi "penugasan" sederhana.

Ketika nilai ditugaskan ke variabel dalam javascript, penerjemah pertama kali mencoba menemukan "deklarasi variabel" dalam konteks / lingkup yang sama dengan penugasan. Saat penerjemah dieksekusidummyVariable = 20 , ia mencari deklarasi dummyVariable di awal fungsi. (Karena semua deklarasi Variabel dipindahkan ke awal konteks oleh penerjemah javascript dan ini disebut hoisting)

Anda mungkin juga ingin melihatnya mengangkat dalam javascript

Simran kaur
sumber