fungsi
Format fungsi
function getPrototynames (o,/*opsional*/ a) {a = a || []; untuk (var p dalam o) {a.push (p);} return a;}Penelepon
func.Caller Mengembalikan fungsi penelepon
function callfunc () {if (callfunc.caller) {alert (callfunc.caller.toString ());} else {waspada ("no function call");}} function handlecaller () {callfunc ();} handlecaller (); // return handlercallfunce () "no function," noull no function, "noull no function," noull no function, "nOUll," nOUll nOUCUTE ();Callee
Panggilan Rekursif Metode Anonim
peringatan ((fungsi (x) {if (x <=) return; return x * arguments.callee (x -);} ())); //cakupan
Setiap orang akrab dengan ruang lingkup. Hari ini saya akan berbicara tentang masalah penutupan dan memahami masalah penutupan secara menyeluruh.
<script> var global = "Global Scope"; // Ini adalah lingkup fungsi lingkup global () {var scope = "Local Scope"; // Ini adalah lingkup pengembalian lingkup lokal; // lingkup yang dikembalikan adalah variabel lokal} </script>1.: Variabel global yang ditentukan juga dapat diakses di dalam fungsi . Ketika variabel lokal yang ditentukan dan nama variabel global adalah sama, variabel lokal akan menyembunyikan variabel global dan tidak akan menghancurkan nilai variabel global.
var scope = "global scope"; function f () {var scope = "local scope"; return scope;} alert (f ()); // local scopealert (scope); // global scope;Di atas memang mudah dimengerti, bukan?
2. Variabel global dapat dinyatakan tanpa var , tetapi variabel lokal harus dinyatakan dengan var. Jika variabel lokal tidak menggunakan deklarasi var, kompiler akan default untuk ini sebagai variabel global.
<span style="line-height: .; font-family: verdana, Arial, Helvetica, sans-serif; font-size: px; background-color: rgb(, , );"> </span> scope = "global scope";function f(){scope = "local scope";return scope;}alert(f());//local scopealert(scope);//local scopeNamun, variabel global tidak menggunakan deklarasi VAR, dan hanya tersedia untuk mode non-ketat. Jika mode ketat digunakan, kesalahan akan dilaporkan.
<script> "Gunakan ketat"; scope = "global scope"; function f () {scope = "Local Scope"; return scope;} alert (f ()); // local scopealert (scope); // local scope </cript>Oleh karena itu, disarankan agar Anda tidak menghilangkan var saat mendeklarasikan variabel, karena dapat menghindari masalah yang tidak perlu.
3. Tidak apa -apa untuk menyatakan terlebih dahulu . Apa yang sebelumnya.
<script> "Gunakan ketat"; scope; console.log (scope); var scope = "global scope"; console.log (scope); </script>
Ini dapat dilihat sebagai yang pertama mencetak tidak ditentukan. Ya, itu belum diberi nilai. Tugas berikut dapat menentukan ruang lingkup global.
Ini tidak salah, tetapi mengapa ini terjadi? Bukankah suatu variabel seharusnya didefinisikan sebelum dapat digunakan?
Di sini saya akan memberi tahu Anda tentang rantai lingkup. JavaScript adalah bahasa lexical scoped.
1. Rantai lingkup adalah objek atau daftar tertaut. Kumpulan kode ini mendefinisikan variabel "dalam ruang lingkup" dari kode ini. Ketika JavaScript perlu menemukan ruang lingkup variabel, itu akan berkembang dan mencari dari objek pertama dalam rantai. Jika objek pertama adalah ruang lingkup, nilai objek ini akan dikembalikan secara langsung. Jika tidak ada, itu akan terus mencari objek kedua sampai ditemukan. Jika variabel tidak ditemukan pada rantai lingkup, kesalahan akan dilemparkan.
Kami dapat mengekspresikan rantai fungsi ini sebagai berikut: temukan scope-> window (objek global) dan kemudian ruang lingkup didefinisikan. Namun, operasi penugasan tidak dilakukan, dan operasi penugasan dilakukan kemudian, sehingga nilainya tidak terdefinisi saat ini.
4. Ini lebih membingungkan. Apa nilai cetaknya?
<script> "Gunakan ketat"; var scope = "global scope"; function f () {console.log (scope); var scope = "local scope"; console.log (scope);} f (); </script>Lihat kode ini: Jika Anda ceroboh, Anda dapat menulis jawaban yang salah:
1. Lingkup gobal
2. Lingkup lokal
Analisis: Deklarasikan variabel global. Ketika di badan fungsi, yang pertama mewakili variabel global, sehingga global dicetak, dan yang kedua mendefinisikan variabel lokal, yang mencakup ruang lingkup global, sehingga ruang lingkup lokal dicetak.
Analisis semacam itu benar -benar benar di C# java. Tetapi analisis di sini memang salah.
Ini menunjukkan bahwa sebelum masalah ini, mari kita lihat pertanyaan terlebih dahulu.
Kalimat ini sangat penting: variabel global selalu didefinisikan dalam program. Variabel lokal selalu didefinisikan dalam tubuh fungsi yang menyatakannya dan fungsinya bersarang.
Jika Anda bekerja dalam bahasa tingkat tinggi, Anda terkena javascript sedikit tidak cocok untuk definisi ruang lingkupnya. Saya sama. Mari kita lihat contoh:
<script> var g = "Global Scope"; function f () {for (var i =; i <; i ++) {for (var j =; j <; j ++) {;} konsol.log (j);} konsol.log (i);} konsol.log (g); f (); </skrip>Apa hasil dari pencetakan?
Anda melihat bahwa {} mewakili blok pernyataan, dan blok pernyataan ada di ruang lingkup blok yang sama, jadi Anda dapat menebak bahwa nilai J dan I telah dirilis dalam memori, sehingga hasilnya harus tidak terdefinisi.
Hasil sebenarnya mungkin mengecewakan Anda.
Mengapa ini terjadi? Ekspresi saya dimulai seperti Anda.
Lihat kalimat yang saya minta untuk Anda ingat sekarang. . . Variabel global selalu didefinisikan dalam program. Variabel lokal selalu didefinisikan dalam tubuh fungsi yang menyatakannya dan fungsinya bersarang.
Tepatnya, parameter fungsi juga termasuk dalam kategori variabel lokal. Kalimat ini juga sangat penting! Lai Lai
Kalimat itu secara kasar berarti bahwa selama variabel yang didefinisikan di dalam fungsi valid dalam seluruh fungsi. Jadi hasilnya tidak sulit untuk dipahami. Melihat kembali pertanyaan kami, apakah Anda mengerti?
Rantai tindakan juga memiliki definisi berikut:
1. Rantai aksi terdiri dari objek global.
2. Dalam badan fungsi yang tidak mengandung bersarang, ada dua objek pada rantai aksi. Objek pertama mendefinisikan parameter fungsi dan variabel lokal, dan yang kedua adalah objek global.
3. Dalam badan fungsi bersarang, setidaknya ada tiga objek pada rantai aksi.
Ketika suatu fungsi didefinisikan, rantai ruang lingkup akan disimpan.
Ketika fungsi ini dipanggil, ia membuat objek baru untuk menyimpan variabel lokalnya dan menambahkan objek ini ke rantai aksi yang disimpan. Pada saat yang sama, buat rantai fungsi baru yang lebih panjang yang mewakili panggilan fungsi.
Untuk fungsi bersarang, ketika fungsi eksternal dipanggil, fungsi internal akan didefinisikan ulang lagi. Karena setiap kali fungsi eksternal dipanggil, rantai aksi berbeda. Fungsi internal memiliki perbedaan halus setiap kali didefinisikan. Setiap kali fungsi eksternal dipanggil, kode fungsi internal adalah sama, dan ruang lingkup kode terkait juga berbeda.
Penutup
Setelah melakukannya begitu lama, saya akhirnya membicarakannya, tetapi mari kita analisis ruang lingkup sebelumnya.
<cript> var nameG = "global" var g = fungsi f () {console.log (name); function demo () {console.log ("demo =" + name);} var name = ""; function demo () {var name = ""; console.log ("demo =" + name); {var name = ""; console.log ("demo =" + name); {function name = ""; console ("Demo =" + name); {fungsi Demo () {console ("Demo =" + name); nameG);} demo (); demo (); demo ();}; g (); </skrip>Kami menganalisis sesuai dengan rantai aksi:
Hubungi demo0, demo0 () -> find name, not found -> f (), return
Hubungi demo1, demo1 ()-> temukan nama, temukan, kembalikan
Hubungi demo2, demo2 () -> temukan nameG, tidak ditemukan -> f () untuk menemukan nameG, tidak ditemukan -> jendela untuk menemukan nama, kembali.
Lihatlah contoh ini:
<script> function f () {var count =; return {counter: function () {return count ++;}, reset: function () {return count =;}}} var d = f (); var c = f (); console.log ("d call pertama:"+ d.counter ()); // console.log ("call first:"+ d.counter ()); // console.log. Hubungi: "+ c.counter ()); // </script>Seperti yang dapat Anda lihat dalam contoh ini, saya melakukan operasi penghitungan dan zeroing.
Dua instance objek F dibuat, masing -masing dengan rantai ruang lingkupnya sendiri, sehingga nilainya tidak saling mempengaruhi. Ketika C disebut kedua kalinya, nilai jumlah disimpan karena objek C tidak dihancurkan. Hanya setelah memahami contoh ini, contoh berikut akan lebih mudah dipahami.
Setiap orang harus sangat jelas tentang proses ini. Jadi sekarang mari kita lihat masalah penutupan. Saya mengatur empat tombol dan mengklik setiap tombol untuk mengembalikan nama respons.
<body> <script> function btninit () {for (var i =; i <; i ++) {var btn = document.getElementById ("btn" + i); btn.addeventListener ("klik", function () {winder ("btn" + i);});}}} window ("btn" + i);}; id = "btn"> btn </button> <tombol id = "btn"> btn </button> <tombol id = "btn"> btn </button> <tombol id = "btn"> btn </button> </div> </body>Klik untuk dijalankan, tetapi hasilnya adalah semua BTN5;
Kami duduk dengan analisis sekarang. Pertama, kita perlu memanggil fungsi anonim -> temukan saya, tidak ditemukan -> btninit (), dan menemukan saya di loop untuk. muncul. Kita tahu bahwa hanya panggilan fungsi yang dirilis, dan untuk saya selalu terlihat, jadi nilai I terakhir dipertahankan. Jadi bagaimana menyelesaikannya.
Untuk menyelesaikan masalah bahwa nilai I tidak selalu terlihat dalam fungsi, kita perlu menggunakan fungsi sarang dan meneruskan nilai I di dalamnya.
function btninit () {for (var i =; i <; i ++) {(function (data_i) {var btn = document.geteLementById ("btn" + data_i); btn.addeventListener ("klik", fungsi () {ware ("btn" + data_i);Melihat kode yang dimodifikasi, pertama -tama jalankan yang pertama dan buat objek. Kami pertama -tama menjalankan fungsi anonim -> data_i, tetapi tidak ditemukan -> fungsi (data_i), dan kemudian dieksekusi lagi untuk membuat objek. Aturan penutupan mengatakan bahwa mereka tidak saling mempengaruhi. Jadi hasil yang benar dapat diperoleh.
Di atas adalah fungsi JavaScript yang harus diketahui (9) yang diperkenalkan oleh editor kepada Anda. Berbicara tentang pengetahuan yang relevan tentang masalah penutupan, saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!