Sự khác biệt chính giữa từ khóa var và let trong JavaScript là gì

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 */
7

Tê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ên

Cũ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 theo

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
}

Ở 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
}
7

if (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ối

let 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 nhau

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 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ạo

Trong 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

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
3

let { 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
4

let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
1

TDZ 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 */
2

Khố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ời

Hiệ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 */
3

Khi đượ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áo

let { bar } = foo; // where foo = { bar:10, baz:12 };
/* This creates a variable with the name 'bar', which has a value of 10 */
4

Tuy 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

Sự khác biệt giữa từ khóa var và let trong Javascript Mcq là gì?

Từ khóa var có phạm vi toàn cầu. Từ khóa let vẫn giới hạn trong phạm vi khối . Người ta có thể dễ dàng khai báo cũng như truy cập nó trên toàn cầu. Người ta có thể dễ dàng khai báo nó trên toàn cầu nhưng không thể truy cập nó trên toàn cầu.

Sự khác biệt giữa VAR và let biến là gì?

let 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 var, 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 giữa VAR và const let trong Javascript là gì?

Các biến được khai báo với var nằm trong phạm vi hàm. Các biến được khai báo là let nằm trong phạm vi khối. Các biến được khai báo là const nằm trong phạm vi khối .

Tại sao let tốt hơn var Javascript?

let cho phép bạn khai báo các biến bị giới hạn phạm vi đối với khối, câu lệnh hoặc biểu thức mà nó được sử dụng . Điều này không giống như từ khóa var, xác định một 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.