Cara menggunakan javascript scope explained
Scope, atau serangkaian aturan yang menentukan di mana variabel Anda tinggal, adalah salah satu konsep paling dasar dari bahasa pemrograman apa pun. Ini sangat fundamental, pada kenyataannya, mudah untuk melupakan betapa halus aturannya! Show
Memahami dengan tepat bagaimana mesin JavaScript "thinks" tentang scope akan membuat Anda tidak bisa menulis bug umum yang dapat menyebabkan masalah, mempersiapkan Anda untuk membungkus head Anda di sekitar penutupan, dan membuat Anda lebih dekat untuk tidak pernah lagi menulis bug. ... Yah, itu akan membantumu mengerti hoisting dan closures, bagaimanapun. Dalam artikel ini, kita akan melihat:
Mari kita selami. Jika Anda tertarik untuk mempelajari lebih lanjut tentang ES6 dan bagaimana memanfaatkan sintaks dan fitur untuk meningkatkan dan menyederhanakan kode JavaScript Anda, mengapa tidak memeriksa dua program ini: Lexical ScopeJika Anda telah menulis mantap baris JavaScript sebelumnya, Anda akan tahu bahwa di mana Anda menjelaskan variabel menentukan di mana Anda dapat menggunakannya. Fakta bahwa visibilitas variabel tergantung pada struktur kode sumber Anda disebut lexical scope. Ada tiga cara untuk membuat scope dalam JavaScript:
"use strict"; var mr_global = "Mr Global"; function foo () { var mrs_local = "Mrs Local"; console.log("I can see " + mr_global + " and " + mrs_local + "."); function bar () { console.log("I can also see " + mr_global + " and " + mrs_local + "."); } } foo(); // Works as expected try { console.log("But /I/ can't see " + mrs_local + "."); } catch (err) { console.log("You just got a " + err + "."); } { let foo = "foo"; const bar = "bar"; console.log("I can use " + foo + bar + " in its block..."); } try { console.log("But not outside of it."); } catch (err) { console.log("You just got another " + err + "."); } // Throws ReferenceError! console.log("Note that " + err + " doesn't exist outside of 'catch'!") Potongan di atas menunjukkan ketiga mekanisme scope. Anda dapat menjalankannya di Node atau Firefox, tetapi Chrome tidak bermain bagus dengan Kami akan membicarakan masing-masing ini dengan sangat detail. Mari kita mulai dengan tampilan mendetail tentang bagaimana JavaScript menggambarkan variabel apa yang termasuk dalam scope apa. Proses Kompilasi: Tampilan Mata BurungKetika Anda menjalankan JavaScript, dua hal terjadi untuk membuatnya bekerja.
Selama langkah kompilasi, mesin JavaScript:
Hanya selama eksekusi bahwa mesin JavaScript benar-benar menetapkan nilai
referensi variabel yang sama dengan nilai tugas mereka. Sampai saat itu, mereka sudah Langkah 1: Compilation// I can use first_name anywhere in this program var first_name = "Peleke"; function popup (first_name) { // I can only use last_name inside of this function var last_name = "Sengstacke"; alert(first_name + ' ' + last_name); } popup(first_name); Mari kita melangkahi apa yang dilakukan oleh kompilator. Pertama, ia membaca baris Kedua, compiler membaca baris dengan Tentu saja, kompilator menemukan satu. Karena kita memiliki Karena tidak ada lagi deklarasi variabel di dalam fungsi, kompilator kembali ke global scope. Dan karena tidak ada lagi deklarasi variabel di sana, fase ini dilakukan. Perhatikan bahwa kami belum benar-benar menjalankan apa pun. Pekerjaan kompilator pada titik ini hanya untuk memastikan ia tahu nama semua orang; tidak peduli apa yang mereka lakukan. Pada titik ini, program kami tahu bahwa:
Itu tidak peduli bahwa kami telah diberi nilai-nilai variabel tersebut di tempat lain dalam kode kita. Mesin mengurus itu dalam eksekusi. Langkah 2: ExecutionSelama langkah berikutnya, mesin membaca kode kita lagi, tetapi kali ini, jalankan itu. Pertama, membaca baris, var Selanjutnya, ia membaca baris, Akhirnya, ia membaca baris
Ketika menjalankan
Ternyata ada lebih banyak yang terjadi di bawah kap mesin daripada yang mungkin kita pikirkan! Sekarang setelah Anda memahami bagaimana JavaScript membaca dan menjalankan kode yang Anda tulis, kami siap untuk mengatasi sesuatu yang sedikit lebih dekat ke home: cara kerja hoisting. Hoisting Di Bawah MicroscopeMari kita mulai dengan beberapa kode. bar(); function bar () { if (!foo) { alert(foo + "? This is strange..."); } var foo = "bar"; } broken(); // TypeError! var broken = function () { alert("This alert won't show up!"); } Jika Anda menjalankan kode ini, Anda akan memperhatikan tiga hal:
Hoisting mengacu pada fakta bahwa JavaScript membuat semua nama variabel yang kami nyatakan tersedia di mana saja dalam scope— termasuk sebelum kami menetapkannya. Tiga kasus dalam cuplikan adalah tiga hal yang perlu Anda ketahui dalam kode Anda sendiri, jadi kami akan melangkah masing-masing satu per satu. Deklarasi Variabel HoistingIngat, ketika kompiler JavaScript membaca baris seperti
Alasan kita bisa menggunakan Sebaliknya, ia mendapat nilai yang Dengan mengingat hal tersebut, kita mungkin membayangkan bahwa apa yang dilihat JavaScript di fungsi function bar () { var foo; // undefined if (!foo) { // !undefined is true, so alert alert(foo + "? This is strange..."); } foo = "bar"; } Ini adalah Aturan Pertama Hoisting, bila Anda akan: Variabel tersedia di seluruh scope
mereka, tetapi memiliki nilai Sebuah idiom JavaScript umum adalah menulis semua deklarasi Ketika
Anda memikirkannya, itu masuk akal. Cukup jelas mengapa Hoisting Function ExpressionsFakta bahwa kami mendapat Kami mendefinisikan sebuah variabel, yang disebut Jelas, Deklarasi Fungsi HoistingAkhirnya, ingat bahwa kami dapat memanggil function bar () { if (!foo) { alert(foo + "? This is strange..."); } var foo = "bar"; } var broken; // undefined bar(); // bar is already defined, executes fine broken(); // Can't execute undefined! broken = function () { alert("This alert won't show up!"); } Sekali lagi, itu lebih masuk akal ketika Anda menulis sebagai JavaScript yang dibaca, bukankah begitu? Untuk meninjau:
Sekarang mari kita lihat dua alat baru yang bekerja sedikit berbeda: let, const, & Zona Mati TemporalTidak seperti deklarasi Setidaknya, tidak persis. Ingat bagaimana kami dapat memanggil "use strict"; // You have to "use strict" to try this in Node broken(); // ReferenceError! let broken = function () { alert("This alert won't show up!"); } Ketika kompilator JavaScript mendaftarkan variabel ke scope dalam lewatan pertama, ia akan memperlakukan Ketika menemukan deklarasi Dengan Ruang antara awal bagian atas ruang lingkup pernyataan ... Juga karena itu akan membunuh program Anda jika Anda mencoba menggunakannya lebih awal. Kata kunci
Ini menjamin bahwa // This is legal const React = require('react'); // This is totally not legal const crypto; crypto = require('crypto'); Block Scope
Ketika Anda mendeklarasikan
variabel dengan Ketika Anda mendeklarasikan variabel dengan Blok adalah bagian kode yang dilepaskan oleh tanda kurung kurawal, seperti yang Anda lihat dengan blok "use strict"; { let foo = "foo"; if (foo) { const bar = "bar"; var foobar = foo + bar; console.log("I can see " + bar + " in this bloc."); } try { console.log("I can see " + foo + " in this block, but not " + bar + "."); } catch (err) { console.log("You got a " + err + "."); } } try { console.log( foo + bar ); // Throws because of 'foo', but both are undefined } catch (err) { console.log( "You just got a " + err + "."); } console.log( foobar ); // Works fine Jika Anda mendeklarasikan variabel dengan Sebuah variabel yang dinyatakan dengan Jika Anda tertarik dengan detail detail tentang Lexical this & Arrow FunctionsDi permukaan, Setidaknya, biasanya tidak. JavaScript, yang terkenal, tidak menyelesaikan arti kata kunci var foo = { name: 'Foo', languages: ['Spanish', 'French', 'Italian'], speak : function speak () { this.languages.forEach(function(language) { console.log(this.name + " speaks " + language + "."); }) } }; foo.speak(); Sebagian besar dari kita mengharapkan Tapi itu tidak. Sebaliknya, ini menciptakan Titik pertama mirip dengan kasus mendefinisikan ulang variabel apa pun dalam child scope: function foo () { var bar = "bar"; function baz () { // Reusing variable names like this is called "shadowing" var bar = "BAR"; console.log(bar); // BAR } baz(); } foo(); // BAR Ganti Secara
tradisional, menjadikan var foo = { name: 'Foo', languages: ['Spanish', 'French', 'Italian'], speak_self : function speak_s () { var self = this; self.languages.forEach(function(language) { console.log(self.name + " speaks " + language + "."); }) }, speak_bound : function speak_b () { this.languages.forEach(function(language) { console.log(this.name + " speaks " + language + "."); }.bind(foo)); // More commonly:.bind(this); } }; Dalam ES2015 membawa kita alternatif baru: fungsi arrow. Tidak seperti fungsi "normal", fungsi panah tidak membayangi parent scope mereka dengan menetapkan nilai Dengan kata lain, jika Anda menggunakan Pertama, ia memeriksa scope lokal untuk nilai Ini memungkinkan kita menulis ulang kode di atas seperti ini: var foo = { name: 'Foo', languages: ['Spanish', 'French', 'Italian'], speak : function speak () { this.languages.forEach((language) => { console.log(this.name + " speaks " + language + "."); }) } }; Jika Anda ingin detail lebih lanjut tentang fungsi arrow, lihat kursus Envato Tuts+ Instruktur Dan Wellman yang sangat baik di Dasar-Dasar ES6 JavaScript, serta dokumentasi MDN pada fungsi arrow. KesimpulanKami telah membahas banyak hal sejauh ini! Dalam artikel ini, Anda telah belajar bahwa:
Anda juga telah melihat dua aturan hoisting:
Langkah selanjutnya yang baik adalah menggunakan pengetahuan baru Anda tentang scope JavaScript untuk membungkus head Anda di sekitar penutupan. Untuk itu, periksa Scopes & Closures Kyle Simpson. Akhirnya, ada
banyak lagi yang bisa dikatakan tentang Sementara itu, ambillah apa yang telah Anda pelajari dan tulis lebih sedikit bug! Apa itu scope di JavaScript?Salah satu variable JavaScript adalah Scope. Variable Scope merupakan wilayah program Anda yang sudah ditentukan. Variabel JavaScript hanya memiliki dua scope. Terdapat dua jenis variabel scope yang ada di JavaScript yaitu Global Variable dan Local Variable.
Apa itu scope dalam program?Variabel Scope (atau ruang lingkup variabel) adalah jangkauan kode program dimana perintah program masih bisa mengakses sebuah variabel. Jika kita mendefenisikan sebuah variabel pada satu file PHP, maka variabel tersebut dapat diakses oleh seluruh kode program pada halaman yang sama.
Apa itu Lexical Scope?Lexical scope adalah scope yang dibaca saat kode JavaScript melalui proses compile, atau sering disebut compile-time. Lexical scope ini yang mengatur di scope mana kita harus mencari sebuah variable.
|