Perbezaan: 1. biarkan pembolehubah mempunyai skop peringkat blok, manakala pembolehubah var tidak mempunyai skop peringkat blok 2. pembolehubah var mempunyai promosi berubah (tiada kekangan zon mati sementara) dan boleh digunakan dahulu dan kemudian diisytiharkan, manakala pembolehubah Let tidak mempunyai promosi pembolehubah (terdapat kekangan zon mati sementara) dan mesti diisytiharkan sebelum digunakan 3. Biarkan pembolehubah tidak boleh diisytiharkan berulang kali, tetapi pembolehubah var boleh.
Persekitaran pengendalian tutorial ini: sistem Windows 7, ECMAScript versi 6, komputer Dell G3.
ES6 menambah perintah let
baharu untuk mengisytiharkan pembolehubah setempat. Penggunaannya adalah serupa dengan var
, tetapi pembolehubah yang diisytiharkan hanya sah dalam blok kod tempat perintah let
terletak (skop peringkat blok), dan terdapat kekangan zon mati sementara.
Mari kita lihat dahulu var
soalan temuduga peningkatan pembolehubah biasa:
题目1: var a = 99; // 全局变量a f(); // f是函数,虽然定义在调用的后面,但是函数声明会提升到作用域的顶部。 console.log(a); // a=>99, 此时是全局变量的a function f() { console.log(a); // 当前的a变量是下面变量a声明提升后,默认值undefined var a = 10; console.log(a); // a => 10 } // 输出结果: undefined 10 99
Jika anda menghadapi kesukaran memahami soalan di atas, sila lihat secara sistematik pada JS lanjutan percuma Lao Ma video Tutorial.
ES6 boleh menggunakan let untuk menentukan pembolehubah peringkat blok
Sebelum ES6, kita semua menggunakan var untuk mengisytiharkan pembolehubah, dan JS hanya mempunyai Fungsi skop dan skop global tidak mempunyai skop peringkat blok, jadi {}
tidak boleh mengehadkan skop akses pembolehubah yang diisytiharkan oleh var.
Sebagai contoh:
{ var i = 9; } console.log(i); // 9
ES6 baharu let
membolehkan anda mengisytiharkan pembolehubah peringkat blok.
{ let i = 9; // i变量只在 花括号内有效!!! } console.log(i); // Uncaught ReferenceError: i is not defined
mari aplikasi unik dengan gelung for
let
sangat sesuai untuk skop peringkat blok di dalam gelung for
. Badan gelung for dalam JS adalah istimewa Setiap pelaksanaan ialah skop blok bebas baharu Selepas pembolehubah yang diisytiharkan dengan let dihantar ke dalam skop badan gelung for, mereka tidak akan berubah dan tidak akan terjejas oleh dunia luar. Lihat soalan temu bual biasa:
for (var i = 0; i <10; i++) { setTimeout(function() { // 同步注册回调函数到 异步的 宏任务队列。 console.log(i); // 执行此代码时,同步代码for循环已经执行完成 }, 0); } // 输出结果 10 共10个 // 这里面的知识点: JS的事件循环机制,setTimeout的机制等
Jika anda menukar var
kepada let
pernyataan:
// i虽然在全局作用域声明,但是在for循环体局部作用域中使用的时候,变量会被固定,不受外界干扰。 for (let i = 0; i < 10; i++) { setTimeout(function() { console.log(i); // i 是循环体内局部作用域,不受外界影响。 }, 0); } // 输出结果: 0 1 2 3 4 5 6 7 8 9
biar tiada promosi berubah-ubah dan sementara Tiada promosi pembolehubah untuk pembolehubah yang diisytiharkan dengan dalam zon mati
let
. Dan pembolehubah tidak boleh digunakan sehingga pernyataan pengisytiharan let
dilaksanakan, jika tidak, ralat Uncaught ReferenceError
akan dilaporkan.
Contohnya:
console.log(aicoder); // 错误:Uncaught ReferenceError ... let aicoder = 'aicoder.com'; // 这里就可以安全使用aicoder
ES6 dengan jelas menetapkan bahawa jika terdapat perintah let dan const dalam blok, pembolehubah yang diisytiharkan oleh blok ini untuk arahan ini dibentuk dari awal Skop tertutup. Sebarang penggunaan pembolehubah ini sebelum pengisytiharan akan mengakibatkan ralat.
Ringkasnya, dalam blok kod, pembolehubah tidak tersedia sehingga ia diisytiharkan menggunakan arahan let. Dari segi tatabahasa, ini dipanggil "zon mati sementara" (TDZ).
biar pembolehubah tidak boleh diisytiharkan berulang kali
biar tidak membenarkan pengisytiharan berulang pembolehubah yang sama dalam skop yang sama. Jika tidak, ralat dilaporkan: Uncaught SyntaxError: Identifier 'XXX' has already been declared
Contohnya:
let a = 0; let a = 'sss'; // Uncaught SyntaxError: Identifier 'a' has already been declared
Ringkasan
ES6 let allow js untuk benar-benar memiliki skop peringkat Blok juga merupakan laluan yang lebih selamat dan lebih standard Walaupun banyak kekangan ditambah, semuanya direka untuk membolehkan kami menggunakan dan menulis kod dengan lebih selamat.
[Cadangan berkaitan: tutorial video javascript, bahagian hadapan web]
Atas ialah kandungan terperinci Apakah perbezaan antara let dan var dalam es6. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!