Saya tidak mengerti mengapa variabel bertingkah aneh ketika dideklarasikan di dalam suatu fungsi.
Dalam
first
fungsi saya mendeklarasikan denganlet
variabelb
danc
dengan nilai 10 :b = c = 10;
Dalam
second
fungsi saya menunjukkan:b + ", " + c
Dan ini menunjukkan:
10, 10
Juga dalam
first
fungsi saya menyatakana
dengan nilai 10 :let a = b = c = 10;
Tetapi dalam
second
fungsi itu menunjukkan kesalahan:Tidak dapat menemukan variabel:
a
Sekarang dalam
first
fungsi saya menyatakand
dengan nilai 20 :var d = 20;
Tetapi dalam
second
fungsi itu menunjukkan kesalahan yang sama seperti sebelumnya, tetapi dengan variabeld
:Tidak dapat menemukan variabel:
d
Contoh:
function first() {
let a = b = c = 10;
var d = 20;
second();
}
function second() {
console.log(b + ", " + c); //shows "10, 10"
try{ console.log(a); } // Rreference error
catch(e){ console.error(e.message) }
try{ console.log(d); } // Reference error
catch(e){ console.error(e.message) }
}
first()
javascript
variable-declaration
interteiment yang buruk
sumber
sumber
b
danc
tidak diawali denganvar
kata kunci.a
dand
bersifat lokal untukfirst
.Dim Apple, Banana, Pear As Fruit
berartiDim Apple / Dim Banana / Dim Pear As Fruit
, dan tidakDim Apple As Fruit / ...
.Jawaban:
Itu karena Anda sebenarnya mengatakan:
Dan bukan apa yang Anda pikir Anda katakan, yaitu:
Anda akan melihat bahwa tidak peduli berapa banyak variabel yang Anda tambahkan ke rantai Anda, itu hanya akan menjadi yang pertama (a) yang menyebabkan kesalahan.
Ini karena "biarkan" lingkup variabel Anda ke blok (atau, "secara lokal", lebih atau kurang berarti "dalam tanda kurung") di mana Anda mendeklarasikannya.
Jika Anda mendeklarasikan variabel tanpa "biarkan", itu akan cakupan variabel secara global.
Jadi, dalam fungsi di mana Anda mengatur variabel Anda, semuanya mendapat nilai 10 (Anda bisa melihat ini di debugger jika Anda meletakkan breakpoint). Jika Anda meletakkan log konsol untuk a, b, c di fungsi pertama itu, semuanya baik-baik saja.
Tapi begitu Anda meninggalkan fungsi itu, yang pertama (a) - dan sekali lagi, ingatlah, secara teknis dalam urutan penugasan, itu adalah yang terakhir - "menghilang" (sekali lagi, Anda dapat melihat ini di debugger jika Anda menetapkan breakpoint pada fungsi kedua), tetapi dua lainnya (atau seberapa banyak yang Anda tambahkan) masih tersedia.
Ini karena, "biarkan" HANYA BERLAKU UNTUK (jadi hanya lingkup lokal) VARIABEL PERTAMA - sekali lagi, yang secara teknis merupakan yang terakhir dideklarasikan dan diberi nilai - dalam rantai. Sisanya secara teknis tidak memiliki "biarkan" di depan mereka. Jadi itu dinyatakan secara teknis secara global (yaitu, pada objek global), itulah sebabnya mereka muncul di fungsi kedua Anda.
Cobalah: hapus kata kunci "biarkan". Semua vars Anda sekarang akan tersedia.
"var" memiliki efek lingkup lokal yang serupa, tetapi berbeda dalam bagaimana variabel "diangkat", yang merupakan sesuatu yang harus Anda pahami, tetapi yang tidak terlibat langsung dengan pertanyaan Anda.
(BTW, pertanyaan ini akan membuat cukup banyak pro JS devs untuk menjadikannya bagus).
Sangat menyarankan Anda menghabiskan waktu dengan perbedaan dalam bagaimana variabel dapat dideklarasikan di JS: tanpa kata kunci, dengan "let", dan dengan "var".
sumber
var
lebihlet
dalam konteks jawaban ini? Saya tidak mengerti.var
dapat rentan terhadap bug jika digunakan dengan sembarangan. Periksa biolavar
harus setiap keuntungan lebihlet
? Izinkan saya mengklarifikasi: konteks modern ketika keduanya opsi dan saya meminta kode yang harus ditulis. Ketika saya menanyakan hal ini sebelumnya, saya telah menerima jawaban tentang "Anda dapat mendeklarasikan ulang variabel denganvar
" dalam hal ini saya harus mengingatkan orang bahwa Anda tidak boleh mendeklarasikan ulang variabel . Entah itu bug atau kesalahan dalam logika kode - jadi manfaat dari deklarasi ulang adalah ... bahwa itu memungkinkan Anda untuk menulis kode yang salah. Saya belum melihat alasan masuk akal yang mendukungvar
ketikalet
juga merupakan pilihan.Dalam fungsi
first()
, variabelb
danc
dibuat dengan cepat, tanpa menggunakanvar
ataulet
.Berbeda dari
Mereka menjadi tersirat global. Itu sebabnya mereka tersedia di
second()
Dari dokumentasi
Untuk menghindari ini, Anda bisa menggunakan
"use strict"
yang akan memberikan kesalahan ketika seseorang menggunakan variabel yang tidak dideklarasikansumber
let a = 10, b = 10, c = 10;
ataulet a, b, c; a = b = c = 10;
cara yang benar untuk mendeklarasikan variabel.b
tidak akan dievaluasi / tercapai, kesalahan akan terjadi pada barislet a = b = c = 10;
, baca dari kanan ke kiri .c
menjadi variabel pertama yang menyebabkanReferenceError
, sisa baris tidak akan dieksekusi (skrip telah berhenti)let a = 10, b = a, c = b;
itu juga berlakuSebelum memanggil hal-hal aneh, mari kita ketahui beberapa dasar-dasarnya terlebih dahulu:
var dan let keduanya digunakan untuk deklarasi variabel dalam JavaScript. Sebagai contoh,
Variabel juga dapat dideklarasikan tanpa menggunakan
var
ataulet
. Sebagai contoh,Sekarang perbedaan antara pendekatan di atas adalah:
var
adalah fungsi tercakupdan
let
adalah scoped blok.Sekarang menurut konsep-konsep ini mari kita lihat kode yang dimaksud:
sumber
var
kata kunci menjadi global terlepas dari di mana ia dinyatakan" harus berupa "ruang lingkup ... menjadi" atau " cakupan ... menjadi " . Menggunakan kata-kata persis orang lain membutuhkan kutipan, baik dari sini atau di tempat lain. meta.stackexchange.com/q/160071/211183Variabel yang menggunakan
let
kata kunci seharusnya hanya tersedia dalam lingkup blok dan tidak tersedia dalam fungsi luar ...Setiap variabel yang Anda nyatakan dengan cara itu tidak menggunakan
let
atauvar
. Anda kehilangan koma di deklarasi variabel.Tidak disarankan untuk mendeklarasikan variabel tanpa
var
kata kunci. Secara tidak sengaja dapat menimpa variabel global yang ada. Cakupan variabel yang dideklarasikan tanpavar
kata kunci menjadi global terlepas dari di mana ia dinyatakan. Variabel global dapat diakses dari mana saja di halaman web.sumber
Itu karena ketika Anda tidak menggunakan
let
atauvar
kemudian variabel dinyatakan dengan cepat, lebih baik Anda menyatakan seperti berikut.sumber
Masalah aneh ini disebabkan oleh aturan pelingkupan dalam JavaScript
Dengan asumsi bahwa Anda ingin mendeklarasikan 3 variabel lokal yang diinisialisasi dengan nilai yang sama (100). Pertama Anda () akan terlihat seperti di bawah ini. Dalam hal ini, second () tidak akan memiliki akses ke salah satu variabel karena mereka lokal ke yang pertama ()
Namun, jika Anda ingin variabel global maka yang pertama () Anda akan terlihat seperti di bawah ini. Dalam hal ini, yang kedua akan memiliki akses ke semua variabel karena mereka berada dalam lingkup global
Variabel lokal (alias. Dapat diakses di blok kode tempat mereka dideklarasikan).
Blok Kode adalah setiap {} dengan baris kode di antaranya.
Variabel global (alias dapat diakses di lingkup global).
Variabel-variabel ini melekat pada objek global. Objek global bergantung pada lingkungan. Ini adalah objek jendela di browser.
Catatan khusus: Anda dapat mendeklarasikan variabel dalam JavaScript tanpa menggunakan kata kunci var, let, const. Variabel yang dideklarasikan dengan cara ini dilampirkan ke objek global, oleh karena itu dapat diakses dalam lingkup global.
a = 100 // is valid and is in global scope
Beberapa artikel untuk dibaca lebih lanjut: https://www.sitepoint.com/demystifying-javascript-variable-scope-hoisting/ https://scotch.io/tutorials/understanding-scope-in-javascript https: //www.digitalocean .com / komunitas / tutorial / pemahaman-variabel-lingkup-mengangkat-di-javascript
sumber
Perbedaan utama adalah aturan pelingkupan. Variabel yang dideklarasikan dengan kata kunci var dicakupkan ke badan fungsi langsung (maka lingkup fungsi) sementara variabel biarkan dilingkupi ke blok penutup langsung yang dilambangkan dengan {} (karenanya ruang lingkup blok). Dan ketika Anda mengatakannya
c dan b memiliki rentang hidup sama seperti bersenang-senang tetapi hanya memiliki rentang blok dan jika Anda mencoba mengakses dengan merujuknya selalu menunjukkan kesalahan tetapi c dan b adalah global sehingga mereka tidak. Anda akan melihat bahwa tidak peduli berapa banyak variabel yang Anda tambahkan ke rantai Anda, itu hanya akan menjadi yang pertama (a) yang menyebabkan kesalahan. Ini karena "biarkan" lingkup variabel Anda ke blok (atau, "secara lokal", kurang lebih berarti "di dalam tanda kurung") di mana Anda mendeklarasikannya. Jika Anda mendeklarasikan variabel tanpa "biarkan", itu akan cakupan variabel secara global. Jadi, dalam fungsi di mana Anda mengatur variabel Anda, semuanya mendapatkan nilai 10 (Anda dapat melihat ini di debugger jika Anda meletakkan break-point). Jika Anda meletakkan log konsol untuk a, b, c di fungsi pertama itu, semuanya baik-baik saja. Tapi begitu Anda meninggalkan fungsi itu, yang pertama (a) - dan sekali lagi, perlu diingat,
sumber
Berikut adalah 3 aspek menarik dari deklarasi variabel dalam JavaScript:
var membatasi ruang lingkup variabel ke blok di mana ia didefinisikan. ( 'var' untuk lingkup lokal .)
biarkan memungkinkan penimpaan sementara nilai variabel eksternal di dalam blok.
Cukup mendeklarasikan variabel tanpa var atau biarkan akan membuat variabel global, terlepas dari mana itu dinyatakan.
Berikut ini adalah demo dari let , yang merupakan tambahan terbaru untuk bahasa ini:
Keluaran:
Penjelasan:
Variabel a dan b dijelaskan di dalam ' first () ', tanpa kata kunci var atau let.
Karena itu, a dan b bersifat global, dan karenanya, dapat diakses di seluruh program.
Dalam fungsi bernama 'kedua' , pernyataan 'let a = 5' untuk sementara menetapkan nilai ' a ' hingga ' 5 ', dalam lingkup fungsi saja.
Di luar lingkup ' second () ', IE, dalam lingkup global, nilai ' a ' akan seperti yang didefinisikan sebelumnya.
sumber