Let ใน JavaScript
ECMAScript 2015
ES2015 引入了两个重要的 JavaScript 新关键词:let
และ const
。
这两个关键字在 JavaScript 中提供了块作用域(Block Scope)变量(和常量)。
在 ES2015 之前,JavaScript 只有两种类型的作用域:สรรพากรณ์ทั่วไปและสรรพากรณ์ฟังก์ชัน。
สรรพากรณ์ทั่วไป
全局(在函数之外)声明的变量拥有สรรพากรณ์ทั่วไป。
ตัวอย่าง
var carName = "porsche"; // 此处的代码可以使用 carName function myFunction() { // 此处的代码也可以使用 carName }
全局变量可以在 JavaScript 程序中的任何位置访问。
สรรพากรณ์ฟังก์ชัน
局部(函数内)声明的变量拥有สรรพากรณ์ฟังก์ชัน。
ตัวอย่าง
// 此处的代码不可以使用 carName function myFunction() { var carName = "porsche"; // code here CAN use carName } // 此处的代码不可以使用 carName
局部变量只能在它们被声明的函数内访问。
JavaScript 块作用域
ผ่าน var
关键词声明的变量没有块作用域。
在块 {} 内声明的变量可以从块之外进行访问。
ตัวอย่าง
{ var x = 10; } // 此处可以使用 x
在 ES2015 之前,JavaScript 是没有块作用域的。
可以使用 let
关键词声明拥有块作用域的变量。
在块 {} 内声明的变量无法从块外访问:
ตัวอย่าง
{ let x = 10; } // 此处不可以使用 x
重新声明变量
使用 var
关键字重新声明变量会带来问题。
在块中重新声明变量也将重新声明块外的变量:
ตัวอย่าง
var x = 10; // 此处 x 为 10 { var x = 6; // 此处 x 为 6 } // 此处 x 为 6
使用 let
关键字重新声明变量可以解决这个问题。
在块中重新声明变量不会重新声明块外的变量:
ตัวอย่าง
var x = 10; // 此处 x 为 10 { let x = 6; // 此处 x 为 6 } // 此处 x 为 10
浏览器支持
Internet Explorer 11 或更早的版本不完全支持 let
关键词。
下表定义了第一个完全支持 let
关键词的浏览器版本:
Chrome 49 | IE / Edge 12 | Firefox 44 | Safari 11 | Opera 36 |
มีนาคม 2016 | กรกฎาคม 2015 | มกราคม 2015 | กันยายน 2017 | มีนาคม 2016 |
สรรพากรณ์วงกลุ่มวน
ใช้ในวงกลุ่มวน var
:
ตัวอย่าง
var i = 7; for (var i = 0; i < 10; i++) { // บทความบางอย่าง } // ตอนนี้ i คือ 10
ใช้ในวงกลุ่มวน let
:
ตัวอย่าง
let i = 7; for (let i = 0; i < 10; i++) { // บทความบางอย่าง } // ตอนนี้ i คือ 7
ในตัวอย่างที่หนึ่ง ตัวแปรที่ใช้ในวงกลุ่มวน var
ประกาศตัวแปรนอกวงกลุ่มวน
ในตัวอย่างที่สอง ตัวแปรที่ใช้ในวงกลุ่มวน let
ไม่ได้ประกาศตัวแปรนอกวงกลุ่มวน
ถ้าใช้ i ในวงกลุ่มวน let
ถ้าประกาศตัวแปร i แล้ว ตัวแปร i จะเห็นได้เมื่อเท่านั้นในวงกลุ่มวน
สรรพากรณ์ฟังก์ชัน
เมื่อประกาศตัวแปรในภายในฟังก์ชัน var
และ let
และเหมือนกัน
พวกเขาทั้งหมดมีสรรพากรณ์ฟังก์ชัน:
function myFunction() { var carName = "porsche"; // สรรพากรณ์ฟังก์ชัน } function myFunction() { let carName = "porsche"; // สรรพากรณ์ฟังก์ชัน }
สรรพากรณ์ทั่วไป
ถ้าประกาศในบล็อคนอก var
และ let
และเหมือนกัน
พวกเขาทั้งหมดมีสรรพากรณ์ทั่วไป:
var x = 10; // สรรพากรณ์ทั่วไป let y = 6; // สรรพากรณ์ทั่วไป
ตัวแปรทั่วไปใน HTML
ในกรณีที่ใช้ JavaScript สรรพากรณ์ทั่วไปเป็นสภาพแวดล้อม JavaScript
ใน HTML ทั้งหมด สรรพากรณ์ทั่วไปเป็นวัตถุ window
ผ่าน var
ตัวแปรที่ถูกกำหนดด้วยคำสั่งหลักเป็นส่วนของวัตถุ window:
ตัวอย่าง
var carName = "porsche"; // รหัสในที่นี้สามารถใช้ window.carName
ผ่าน let
ตัวแปรที่ถูกกำหนดด้วยคำสั่งหลักไม่เป็นส่วนของวัตถุ window:
ตัวอย่าง
let carName = "porsche"; // รหัสในที่นี้ไม่สามารถใช้ window.carName
ประกาศความเป็นตัวแปรอีกครั้ง
อนุญาตใช้ในทุกตำแหน่งของโปรแกรม var
ประกาศความเป็นตัวแปร JavaScript อีกครั้ง:
ตัวอย่าง
var x = 10; // ตอนนี้ x คือ 10 var x = 6; // ตอนนี้ x คือ 6
ในโซนที่เดียวกัน หรือในบล็อคที่เดียวกัน let
การประกาศตัวแปรอีกครั้ง var
ตัวแปรนั้นไม่อนุญาต
ตัวอย่าง
var x = 10; // อนุญาต let x = 6; // ไม่อนุญาต { var x = 10; // อนุญาต let x = 6; // ไม่อนุญาต }
ในโซนที่เดียวกัน หรือในบล็อคที่เดียวกัน let
การประกาศตัวแปรอีกครั้ง let
ตัวแปรนั้นไม่อนุญาต
ตัวอย่าง
let x = 10; // อนุญาต let x = 6; // ไม่อนุญาต { let x = 10; // อนุญาต let x = 6; // ไม่อนุญาต }
ในโซนที่เดียวกัน หรือในบล็อคที่เดียวกัน var
การประกาศตัวแปรอีกครั้ง let
ตัวแปรนั้นไม่อนุญาต
ตัวอย่าง
let x = 10; // อนุญาต var x = 6; // ไม่อนุญาต { let x = 10; // อนุญาต var x = 6; // ไม่อนุญาต }
ในโซนที่แยกต่างกันหรือในบล็อคต่างกัน let
การประกาศตัวแปรอีกครั้งนั้นอนุญาต
ตัวอย่าง
let x = 6; // อนุญาต { let x = 7; // อนุญาต } { let x = 8; // อนุญาต }
lifting
ผ่าน var
ตัวแปรที่ถูกประกาศจะliftingไปบนด้านบน ถ้าคุณไม่เข้าใจว่าเรียกว่า lifting โปรดเรียกดูบทบรรณานุกรมที่เราเขียนเกี่ยวกับ lifting
คุณสามารถใช้ตัวแปรก่อนประกาศได้
ตัวอย่าง
// ในที่นี้ คุณสามารถใช้ carName var carName;
ผ่าน let
ตัวแปรที่ถูกประกาศจะไม่ถูกนำขึ้นไปบนด้านบน
ในการประกาศ let
การใช้ตัวแปรก่อนปิดบรรทัดการประกาศจะทำให้เกิด ReferenceError
ตัวแปรจะอยู่ใน "zone of temporally dead" จนถึงจุดปิดบรรทัดการประกาศ
ตัวอย่าง
// ในที่นี้ คุณไม่สามารถใช้ carName let carName;