Khai báo
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 khai báo một biến cục bộ trong phạm vi khối, tùy chọn khởi tạo nó thành một giá trịlet name1 [= value1] [, name2 [= value2]] [, ..., nameN [= valueN]
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
7Tên biến hoặc các biến cần khai báo. Mỗi cái phải là một mã định danh JavaScript hợp pháp
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
8 Tùy chọnĐối với mỗi biến được khai báo, bạn có thể tùy chọn chỉ định giá trị ban đầu của nó cho bất kỳ biểu thức JavaScript hợp pháp nào
Ngoài ra, cú pháp Gán cấu trúc cũng có thể được sử dụng để khai báo các biến
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 cho phép bạn khai báo các biến bị giới hạn trong phạm vi của câu lệnh khối hoặc biểu thức mà nó được sử dụng, không giống như từ khóa if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0, khai báo biến toàn cục hoặc cục bộ cho toàn bộ hàm bất kể phạm vi khối. Sự khác biệt khác giữa if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0 và let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 là cái sau chỉ có thể được truy cập sau khi đạt được tuyên bố của nó [xem ]. Vì lý do này, các khai báo let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 thường được coi là không được nâng lênCũng giống như đối tượng
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 không tạo thuộc tính của đối tượng if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
6 khi được khai báo trên toàn cầu [trong phạm vi trên cùng]Có thể tìm thấy lời giải thích tại sao tên "let" được chọn tại đây
Có thể tránh được nhiều vấn đề với biến
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 bằng cách khai báo chúng ở đầu phạm vi mà chúng được sử dụng [làm như vậy có thể ảnh hưởng đến khả năng đọc]Không giống như
if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0, let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 bắt đầu. Điều đó có nghĩa là bạn không thể sử dụng một khai báo let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 đơn lẻ làm phần thân của một khối [điều này hợp lý vì không có cách nào để truy cập vào biến]if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
Các biến được khai báo bởi
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 có phạm vi của chúng trong khối mà chúng được khai báo, cũng như trong bất kỳ khối phụ nào được chứa. Bằng cách này, let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 hoạt động rất giống với if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0. Sự khác biệt chính là phạm vi của một biến if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0 là toàn bộ chức năng kèm theofunction varTest[] {
var x = 1;
{
var x = 2; // same variable!
console.log[x]; // 2
}
console.log[x]; // 2
}
function letTest[] {
let x = 1;
{
let x = 2; // different variable
console.log[x]; // 2
}
console.log[x]; // 1
}
Ở cấp độ cao nhất của các chương trình và chức năng,
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6, không giống như if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0, không tạo thuộc tính trên đối tượng toàn cục. Ví dụvar x = 'global';
let y = 'global';
console.log[this.x]; // "global"
console.log[this.y]; // undefined
Việc khai báo lại cùng một biến trong cùng một chức năng hoặc phạm vi khối sẽ làm tăng
function varTest[] {
var x = 1;
{
var x = 2; // same variable!
console.log[x]; // 2
}
console.log[x]; // 2
}
function letTest[] {
let x = 1;
{
let x = 2; // different variable
console.log[x]; // 2
}
console.log[x]; // 1
}
7if [x] {
let foo;
let foo; // SyntaxError thrown.
}
Bạn có thể gặp lỗi trong câu lệnh
function varTest[] {
var x = 1;
{
var x = 2; // same variable!
console.log[x]; // 2
}
console.log[x]; // 2
}
function letTest[] {
let x = 1;
{
let x = 2; // different variable
console.log[x]; // 2
}
console.log[x]; // 1
}
8 vì chỉ có một khốilet x = 1;
switch[x] {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError for redeclaration.
break;
}
Một khối được lồng bên trong một mệnh đề trường hợp sẽ tạo ra một môi trường từ vựng có phạm vi khối mới, tránh các lỗi khai báo lại được hiển thị ở trên
let x = 1;
switch[x] {
case 0: {
let foo;
break;
}
case 1: {
let foo;
break;
}
}
Nếu bạn đang thử nghiệm trong REPL, chẳng hạn như bảng điều khiển web Firefox [Công cụ > Nhà phát triển web > Bảng điều khiển web] và bạn chạy hai khai báo
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 có cùng tên trong hai đầu vào riêng biệt, thì bạn có thể gặp lỗi khai báo lại giống nhau. Xem thảo luận thêm về vấn đề này trong lỗi 1580891. Bảng điều khiển Chrome cho phép khai báo lại let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 giữa các đầu vào REPL khác nhauBiến
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 hoặc if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
4 được cho là nằm trong "vùng chết tạm thời" [TDZ] từ khi bắt đầu khối cho đến khi quá trình thực thi mã đến dòng nơi biến được khai báo và khởi tạoTrong khi ở bên trong TDZ, biến chưa được khởi tạo với giá trị và bất kỳ nỗ lực nào để truy cập vào biến đó sẽ dẫn đến lỗi
var x = 'global';
let y = 'global';
console.log[this.x]; // "global"
console.log[this.y]; // undefined
3. Biến được khởi tạo với một giá trị khi thực thi đến dòng mã nơi nó được khai báo. Nếu không có giá trị ban đầu nào được chỉ định với khai báo biến, nó sẽ được khởi tạo với giá trị là var x = 'global';
let y = 'global';
console.log[this.x]; // "global"
console.log[this.y]; // undefined
4Điều này khác với các biến, sẽ trả về giá trị
var x = 'global';
let y = 'global';
console.log[this.x]; // "global"
console.log[this.y]; // undefined
4 nếu chúng được truy cập trước khi chúng được khai báo. Đoạn mã dưới đây cho thấy kết quả khác nhau khi truy cập let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 và if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0 trong đoạn mã trước dòng mà chúng được khai báo{ // TDZ starts at beginning of scope
console.log[bar]; // undefined
console.log[foo]; // ReferenceError
var bar = 1;
let foo = 2; // End of TDZ [for foo]
}
Thuật ngữ "thời gian" được sử dụng vì vùng phụ thuộc vào thứ tự thực hiện [thời gian] hơn là thứ tự viết mã [vị trí]. Ví dụ: mã bên dưới hoạt động vì mặc dù hàm sử dụng biến
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 xuất hiện trước khi biến được khai báo, nhưng hàm được gọi bên ngoài TDZ{
// TDZ starts at beginning of scope
const func = [] => console.log[letVar]; // OK
// Within the TDZ letVar access throws `ReferenceError`
let letVar = 3; // End of TDZ [for letVar]
func[]; // Called outside TDZ!
}
TDZ và if [x] {
let foo;
let foo; // SyntaxError thrown.
}
0
if [x] {
let foo;
let foo; // SyntaxError thrown.
}
Sử dụng toán tử
if [x] {
let foo;
let foo; // SyntaxError thrown.
}
0 cho biến let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 trong TDZ của nó sẽ đưa ra kết quả var x = 'global';
let y = 'global';
console.log[this.x]; // "global"
console.log[this.y]; // undefined
3let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
0Điều này khác với việc sử dụng
if [x] {
let foo;
let foo; // SyntaxError thrown.
}
0 cho các biến không được khai báo và các biến có giá trị là var x = 'global';
let y = 'global';
console.log[this.x]; // "global"
console.log[this.y]; // undefined
4let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
1TDZ kết hợp với phạm vi từ vựng
Đoạn mã sau dẫn đến một
var x = 'global';
let y = 'global';
console.log[this.x]; // "global"
console.log[this.y]; // undefined
3 tại dòng được hiển thịlet { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
2Khối
if [x] {
let foo;
let foo; // SyntaxError thrown.
}
7 được đánh giá vì khối bên ngoài if [x] {
let foo;
let foo; // SyntaxError thrown.
}
8 có giá trị. Tuy nhiên do phạm vi từ vựng, giá trị này không khả dụng bên trong khối. mã định danh if [x] {
let foo;
let foo; // SyntaxError thrown.
}
9 bên trong khối if [x] {
let foo;
let foo; // SyntaxError thrown.
}
7 là let x = 1;
switch[x] {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError for redeclaration.
break;
}
1. Biểu thức let x = 1;
switch[x] {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError for redeclaration.
break;
}
2 ném ra một var x = 'global';
let y = 'global';
console.log[this.x]; // "global"
console.log[this.y]; // undefined
3 vì quá trình khởi tạo của let x = 1;
switch[x] {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError for redeclaration.
break;
}
1 chưa hoàn thành — nó vẫn ở trong vùng chết tạm thờiHiện tượng này có thể gây nhầm lẫn trong một tình huống như sau. Lệnh
let x = 1;
switch[x] {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError for redeclaration.
break;
}
5 đã nằm trong phạm vi riêng của khối vòng lặp for. Vì vậy, mã định danh let x = 1;
switch[x] {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError for redeclaration.
break;
}
6 được phân giải thành thuộc tính 'let x = 1;
switch[x] {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError for redeclaration.
break;
}
7' của đối tượng 'let x = 1;
switch[x] {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError for redeclaration.
break;
}
8' nằm trong phần đầu tiên của chính hướng dẫn [let x = 1;
switch[x] {
case 0:
let foo;
break;
case 1:
let foo; // SyntaxError for redeclaration.
break;
}
9]Điều này vẫn còn trong vùng chết tạm thời vì tuyên bố khai báo của nó chưa được đạt và kết thúc
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
3Khi được sử dụng bên trong một khối,
let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 giới hạn phạm vi của biến đối với khối đó. Lưu ý sự khác biệt giữa if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0, có phạm vi bên trong hàm nơi nó được khai báolet { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
4Tuy nhiên, sự kết hợp giữa khai báo
if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0 và let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
6 bên dưới là một function varTest[] {
var x = 1;
{
var x = 2; // same variable!
console.log[x]; // 2
}
console.log[x]; // 2
}
function letTest[] {
let x = 1;
{
let x = 2; // different variable
console.log[x]; // 2
}
console.log[x]; // 1
}
7 do if [true] let a = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
0 được nâng lên trên cùng của khối. Điều này dẫn đến việc khai báo lại ngầm định của biến