Rumah hujung hadapan web tutorial js Nota Kajian Javascript - Fungsi (6): Skop dan Ruang Nama_Pengetahuan Asas

Nota Kajian Javascript - Fungsi (6): Skop dan Ruang Nama_Pengetahuan Asas

May 16, 2016 pm 04:30 PM
javascript Skop ruang nama

Dalam pengenalan sebelum ini, kita sudah tahu bahawa Javascript tidak mempunyai skop peringkat blok, hanya skop peringkat fungsi.

Salin kod Kod adalah seperti berikut:

function test() { // skop
for(var i = 0; i < 10; i ) { // bukan skop
               // kira
}
console.log(i); // 10
}

Juga tiada ruang nama yang jelas dalam Javascript, yang bermaksud segala-galanya ditakrifkan dalam skop global. Setiap kali pembolehubah dirujuk, Javascript akan merentasi keseluruhan skop global sehingga ia menemui pembolehubah. Jika pembolehubah tidak ditemui selepas merentasi keseluruhan skop global, ReferenceError akan dilemparkan.

Sila masukkan penerangan imej

Pembolehubah global tersirat

Salin kod Kod adalah seperti berikut:

// skrip A
foo = '42';
// skrip B
var foo = '42'

Dua contoh di atas menghasilkan kesan yang berbeza. Yang pertama akan mentakrifkan pembolehubah foo dalam skop global, manakala yang kedua akan mentakrifkan pembolehubah foo dalam skop semasa.
Kita mesti ambil perhatian bahawa tidak menggunakan kata kunci var akan mempunyai kesan yang tidak dijangka.

Salin kod Kod adalah seperti berikut:

// skop global
var foo = 42;
ujian fungsi() {
// skop tempatan
foo = 21;
}
ujian();
foo; // 21

Memandangkan var tidak digunakan untuk mentakrifkan pembolehubah foo dalam ujian fungsi, pembolehubah global foo di luar fungsi akan ditimpa. Walaupun ia mungkin tidak kelihatan seperti masalah besar, apabila terdapat beribu-ribu baris kod, ini boleh menjadi pepijat yang sukar untuk dijejaki.

Salin kod Kod adalah seperti berikut:

// skop global
var item = [/* beberapa senarai */];
untuk(var i = 0; i < 10; i ) {
subGelung();
}
fungsi subGelung() {
// skop subGelung
for(i = 0; i < 10; i ) { // pernyataan var tiada
              // lakukan perkara yang menakjubkan!
}
}

Dalam contoh di atas, gelung luar akan berhenti pada kali pertama ia dilaksanakan, kerana pembolehubah i di dalam fungsi gelung kecil akan menimpa pembolehubah global luar i. Kita hanya perlu menambah var di dalam fungsi untuk mengelakkan ralat ini, jadi kita tidak boleh lupa untuk menambah kata kunci var semasa mentakrifkan pembolehubah. Melainkan jika kita benar-benar mahu mempengaruhi pembolehubah global luaran.

Pembolehubah setempat

Pembolehubah setempat dalam Javascript hanya boleh dijana dalam dua cara, satu adalah untuk mengisytiharkan melalui kata kunci var, dan satu lagi adalah sebagai parameter formal fungsi.

Salin kod Kod adalah seperti berikut:

// skop global
var foo = 1;
bar var = 2;
var i = 2;
ujian fungsi(i) {
// skop tempatan ujian fungsi
i = 5;
var foo = 3;
bar = 4;
}
ujian(10);

Pada masa ini, pembolehubah i dan foo di dalam ujian fungsi ialah pembolehubah tempatan, dan bar akan menimpa bar pembolehubah global luaran.

Mengangkat

Javascript akan menaikkan pengisytiharan pembolehubah, yang bermaksud bahawa ungkapan var dan pengisytiharan fungsi akan dinaikkan ke bahagian atas skop.

Salin kod Kod adalah seperti berikut:

bar();
bar var = function() {};
var someValue = 42;
ujian();
ujian fungsi(data) {
Jika (salah) {
         goo = 1;
} lain {
      var goo = 2;
}
untuk(var i = 0; i < 100; i ) {
      var e = data[i];
}
}

Sebelum menjalankan kod di atas, ungkapan var dan pengisytiharan ujian fungsi akan dinaikkan pangkat ke atas, jadi program akan berjalan seperti biasa dan tiada ralat akan dilaporkan.

Salin kod Kod adalah seperti berikut:

// pernyataan var telah dialihkan ke sini
bar var, someValue; // lalai kepada 'undefined'
// pengisytiharan fungsi juga telah dialihkan
ujian fungsi(data) {
var goo, i, e; // skop blok yang hilang memindahkannya ke sini
Jika (salah) {
         goo = 1;
} lain {
         goo = 2;
}
untuk(i = 0; i < 100; i ) {
         e = data[i];
}
}
bar(); // gagal dengan TypeError kerana bar masih 'tidak ditentukan'
someValue = 42; // tugasan tidak terjejas oleh pengangkatan
bar = function() {};
ujian();

Memandangkan Javascript tidak mempunyai skop peringkat blok, ini bukan sahaja akan meningkatkan ekspresi var, tetapi juga menjadikan struktur if kurang intuitif.
Dalam contoh di atas, walaupun nampaknya jika beroperasi pada pembolehubah global goo, sebenarnya, kerana pembolehubah goo dipromosikan, ia adalah pembolehubah tempatan yang diubah suai.
Tanpa memahami peraturan angkat, anda mungkin berfikir bahawa kod berikut akan membuang ReferenceError.

Salin kod Kod adalah seperti berikut:

// semak sama ada SomeImportantThing telah dimulakan
jika (!Sesuatu yang Penting) {
var SomeImportantThing = {};
}

Sudah tentu kod di atas adalah bebas ralat kerana ungkapan var telah dinaikkan pangkat ke atas sebelum kod dijalankan.

Salin kod Kod adalah seperti berikut:

var SomeImportantThing;
// kod lain mungkin memulakan SomeImportantThing di sini, atau tidak
// pastikan ia ada
jika (!Sesuatu Perkara Penting) {
SomeImportantThing = {};
}

Saya ingin mengesyorkan siaran blog @nightire Fan Ge "Memahami JavaScript (2)", yang menerangkan penambahbaikan dengan sangat teliti.
Pesanan peleraian nama

Apabila cuba mengakses pembolehubah foo dalam skop fungsi, Javascript akan melihat dalam susunan berikut:

Sama ada terdapat takrifan var foo dalam skop semasa.
Sama ada terdapat pembolehubah foo dalam parameter fungsi.
Sama ada fungsi itu sendiri dinamakan foo.
Lompat ke domain luar dan cari dari bahagian pertama.
Ruang nama

Salah satu masalah yang paling biasa ialah konflik penamaan, yang disebabkan oleh Javascript hanya mempunyai satu skop global. Tetapi masalah ini boleh diselesaikan dengan fungsi luaran tanpa nama.

Salin kod Kod adalah seperti berikut:

(fungsi() {
// "ruang nama" yang mengandungi diri
window.foo = function() {
                // penutupan terdedah
};
})(); // laksanakan fungsi dengan segera

Fungsi tanpa nama dalam contoh di atas dianggap sebagai ungkapan, jadi ia akan dilaksanakan.

Salin kod Kod adalah seperti berikut:

( // nilaikan fungsi di dalam kurungan
fungsi() {}
) // dan kembalikan objek fungsi
() // panggil keputusan penilaian

Sudah tentu kita juga boleh memanggil ungkapan fungsi dengan cara lain, dengan struktur yang berbeza, tetapi kesan yang sama.

Salin kod Kod adalah seperti berikut:

// Beberapa gaya lain untuk menggunakan terus
!function(){}()
function(){}()
(fungsi(){}());
// dan seterusnya...

Ringkasan

Adalah disyorkan agar anda menggunakan fungsi luaran tanpa nama untuk merangkum kod ke dalam ruang Ini bukan sahaja dapat menyelesaikan konflik ruang nama, tetapi juga memudahkan pemodulatan program.
Selain itu, menggunakan pembolehubah global bukanlah amalan yang baik, kerana ia memerlukan kos penyelenggaraan dan terdedah kepada ralat.

Jenis ruang nama, fungsi, pembolehubah, templat, dll. semuanya milik entiti.
Perkara utama yang mempunyai persamaan entiti ialah mereka boleh mempunyai nama. (Selain itu, label juga boleh mempunyai nama, tetapi ia bukan entiti.)
Skop ruang nama ialah istilah umum untuk jenis skop, disandingkan dengan skop blok, skop kelas, skop prototaip fungsi dan skop fungsi (hanya sah untuk label). Nama yang diisytiharkan dalam ruang nama adalah dalam skop ruang nama. Nama global dianggap berada dalam skop ruang nama global yang tersirat.

Peranan ruang nama sememangnya skop, tetapi ia berbeza daripada skop ringkas Anda boleh mengisytiharkan ruang nama yang sama berbilang kali di beberapa tempat, tetapi kandungannya tidak boleh ditakrifkan semula menjadi satu nama. Ruang, sama seperti std, takrifan makro di mana-mana

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penggunaan typedef struct dalam bahasa c Penggunaan typedef struct dalam bahasa c May 09, 2024 am 10:15 AM

typedef struct digunakan dalam bahasa C untuk mencipta alias jenis struktur untuk memudahkan penggunaan struktur. Ia alias jenis data baharu kepada struktur sedia ada dengan menentukan alias struktur. Faedah termasuk kebolehbacaan yang dipertingkatkan, penggunaan semula kod dan pemeriksaan jenis. Nota: Struktur mesti ditakrifkan sebelum menggunakan alias itu mestilah unik dalam program dan hanya sah dalam skop di mana ia diisytiharkan.

Bagaimana untuk menyelesaikan pembolehubah yang diharapkan dalam java Bagaimana untuk menyelesaikan pembolehubah yang diharapkan dalam java May 07, 2024 am 02:48 AM

Pengecualian nilai jangkaan pembolehubah dalam Java boleh diselesaikan dengan: memulakan pembolehubah menggunakan nilai nol menggunakan semakan dan tugasan;

Kelebihan dan kekurangan penutupan dalam js Kelebihan dan kekurangan penutupan dalam js May 10, 2024 am 04:39 AM

Kelebihan penutupan JavaScript termasuk mengekalkan skop pembolehubah, membolehkan kod modular, pelaksanaan tertunda, dan keburukan pengendalian peristiwa termasuk kebocoran memori, peningkatan kerumitan, overhed prestasi dan kesan rantaian skop.

Apa yang termasuk bermakna dalam c++ Apa yang termasuk bermakna dalam c++ May 09, 2024 am 01:45 AM

Arahan prapemproses #include dalam C++ memasukkan kandungan fail sumber luaran ke dalam fail sumber semasa, menyalin kandungannya ke lokasi yang sepadan dalam fail sumber semasa. Digunakan terutamanya untuk memasukkan fail pengepala yang mengandungi pengisytiharan yang diperlukan dalam kod, seperti #include <iostream> untuk memasukkan fungsi input/output standard.

Petunjuk pintar C++: analisis komprehensif kitaran hayat mereka Petunjuk pintar C++: analisis komprehensif kitaran hayat mereka May 09, 2024 am 11:06 AM

Kitaran hayat penunjuk pintar C++: Penciptaan: Penunjuk pintar dicipta apabila memori diperuntukkan. Pemindahan pemilikan: Pindahkan pemilikan melalui operasi pemindahan. Keluaran: Memori dikeluarkan apabila penunjuk pintar keluar dari skop atau dikeluarkan secara eksplisit. Pemusnahan objek: Apabila objek runcing dimusnahkan, penunjuk pintar menjadi penunjuk tidak sah.

Terdapat beberapa situasi di mana ini dalam js menunjuk ke Terdapat beberapa situasi di mana ini dalam js menunjuk ke May 06, 2024 pm 02:03 PM

Dalam JavaScript, jenis penunjuk ini termasuk: 1. Objek global 2. Panggilan fungsi; 4. Pengendali acara; Selain itu, penunjuk kepada ini boleh ditetapkan secara eksplisit menggunakan kaedah bind(), call(), dan apply().

Bolehkah definisi fungsi dan panggilan dalam C++ bersarang? Bolehkah definisi fungsi dan panggilan dalam C++ bersarang? May 06, 2024 pm 06:36 PM

boleh. C++ membenarkan definisi dan panggilan fungsi bersarang. Fungsi luaran boleh menentukan fungsi terbina dalam, dan fungsi dalaman boleh dipanggil terus dalam skop. Fungsi bersarang meningkatkan enkapsulasi, kebolehgunaan semula dan kawalan skop. Walau bagaimanapun, fungsi dalaman tidak boleh mengakses pembolehubah tempatan fungsi luaran secara langsung, dan jenis nilai pulangan mesti konsisten dengan pengisytiharan fungsi luaran Fungsi dalaman tidak boleh rekursif sendiri.

Bagaimanakah penutupan dilaksanakan di Jawa? Bagaimanakah penutupan dilaksanakan di Jawa? May 03, 2024 pm 12:48 PM

Penutupan dalam Java membenarkan fungsi dalaman mengakses pembolehubah skop luar walaupun fungsi luar telah keluar. Dilaksanakan melalui kelas dalaman tanpa nama, kelas dalam memegang rujukan kepada kelas luar dan memastikan pembolehubah luar aktif. Penutupan meningkatkan fleksibiliti kod, tetapi anda perlu sedar tentang risiko kebocoran memori kerana rujukan kepada pembolehubah luaran oleh kelas dalaman tanpa nama memastikan pembolehubah tersebut hidup.

See all articles