Làm cách nào để giữ lại giá trị biến trong JavaScript?

Tôi hiểu ý tưởng rằng biến cục bộ độc lập với biến toàn cục và cả hai biến này có thể tồn tại trong cùng một chương trình mà không can thiệp. Câu hỏi của tôi là, nếu tôi muốn sử dụng một hàm để thay đổi biến toàn cục thì sao?

Một trong những đặc điểm cơ bản nhất của ngôn ngữ lập trình là tập hợp các kiểu dữ liệu mà nó hỗ trợ. Đây là những loại giá trị có thể được biểu diễn và thao tác trong ngôn ngữ lập trình

JavaScript cho phép bạn làm việc với ba kiểu dữ liệu nguyên thủy –

  • Số, ví dụ. 123, 120. 50 vv

  • Chuỗi văn bản e. g. "Chuỗi văn bản này", v.v.

  • Boolean e. g. đúng hay sai

JavaScript cũng định nghĩa hai loại dữ liệu tầm thường, null và không xác định, mỗi loại chỉ xác định một giá trị duy nhất. Ngoài các kiểu dữ liệu nguyên thủy này, JavaScript hỗ trợ một kiểu dữ liệu tổng hợp được gọi là đối tượng. Chúng tôi sẽ đề cập chi tiết về các đối tượng trong một chương riêng

Lưu ý - JavaScript không phân biệt giữa giá trị số nguyên và giá trị dấu phẩy động. Tất cả các số trong JavaScript được biểu diễn dưới dạng giá trị dấu phẩy động. JavaScript đại diện cho các số sử dụng định dạng dấu phẩy động 64-bit được xác định bởi tiêu chuẩn IEEE 754

Biến JavaScript

Giống như nhiều ngôn ngữ lập trình khác, JavaScript có các biến. Các biến có thể được coi là các thùng chứa được đặt tên. Bạn có thể đặt dữ liệu vào các vùng chứa này và sau đó tham khảo dữ liệu chỉ bằng cách đặt tên cho vùng chứa

Trước khi bạn sử dụng một biến trong chương trình JavaScript, bạn phải khai báo nó. Các biến được khai báo với từ khóa var như sau

Bạn cũng có thể khai báo nhiều biến với cùng một từ khóa var như sau -

Lưu trữ một giá trị trong một biến được gọi là khởi tạo biến. Bạn có thể thực hiện khởi tạo biến tại thời điểm tạo biến hoặc tại thời điểm sau đó khi bạn cần biến đó

Chẳng hạn, bạn có thể tạo một biến có tên money và gán giá trị 2000. 50 đến nó sau. Đối với một biến khác, bạn có thể gán giá trị tại thời điểm khởi tạo như sau

Lưu ý - Chỉ sử dụng từ khóa var để khai báo hoặc khởi tạo, một lần cho vòng đời của bất kỳ tên biến nào trong tài liệu. Bạn không nên khai báo lại cùng một biến hai lần

JavaScript là ngôn ngữ chưa gõ. Điều này có nghĩa là một biến JavaScript có thể chứa giá trị của bất kỳ loại dữ liệu nào. Không giống như nhiều ngôn ngữ khác, bạn không cần phải thông báo cho JavaScript trong khi khai báo biến loại giá trị mà biến đó sẽ giữ. Loại giá trị của một biến có thể thay đổi trong quá trình thực thi chương trình và JavaScript sẽ tự động xử lý nó

Phạm vi biến JavaScript

Phạm vi của một biến là vùng chương trình của bạn mà nó được định nghĩa. Biến JavaScript chỉ có hai phạm vi

  • Biến toàn cục - Một biến toàn cục có phạm vi toàn cầu, nghĩa là nó có thể được xác định ở bất kỳ đâu trong mã JavaScript của bạn

  • Biến cục bộ - Một biến cục bộ sẽ chỉ hiển thị trong một hàm nơi nó được xác định. Các tham số chức năng luôn là cục bộ của chức năng đó

Trong phần thân của hàm, biến cục bộ được ưu tiên hơn biến toàn cục có cùng tên. Nếu bạn khai báo một biến cục bộ hoặc tham số hàm có cùng tên với biến toàn cục, bạn sẽ ẩn biến toàn cục một cách hiệu quả. Hãy xem xét ví dụ sau

      
           
   

Điều này tạo ra kết quả sau -

local

Tên biến JavaScript

Khi đặt tên cho các biến của bạn trong JavaScript, hãy ghi nhớ các quy tắc sau

  • Bạn không nên sử dụng bất kỳ từ khóa dành riêng nào của JavaScript làm tên biến. Những từ khóa này được đề cập trong phần tiếp theo. Ví dụ: tên biến break hoặc boolean không hợp lệ

  • Tên biến JavaScript không được bắt đầu bằng chữ số [0-9]. Chúng phải bắt đầu bằng một chữ cái hoặc ký tự gạch dưới. Ví dụ: 123test là tên biến không hợp lệ nhưng _123test là tên biến hợp lệ

  • Tên biến JavaScript phân biệt chữ hoa chữ thường. Ví dụ: Tên và tên là hai biến khác nhau

Các từ dành riêng cho JavaScript

Danh sách tất cả các từ dành riêng trong JavaScript được đưa ra trong bảng sau. Chúng không thể được sử dụng làm biến JavaScript, hàm, phương thức, nhãn vòng lặp hoặc bất kỳ tên đối tượng nào

JavaScript là một ngôn ngữ rất hướng chức năng. Nó cho chúng ta rất nhiều tự do. Một hàm có thể được tạo bất cứ lúc nào, được truyền dưới dạng đối số cho một hàm khác và sau đó được gọi từ một vị trí mã hoàn toàn khác

Chúng ta đã biết rằng một hàm có thể truy cập các biến bên ngoài nó ["biến ngoài"]

Nhưng điều gì sẽ xảy ra nếu các biến bên ngoài thay đổi kể từ khi một hàm được tạo?

Và điều gì sẽ xảy ra nếu một hàm được truyền dưới dạng đối số và được gọi từ một vị trí khác của mã, liệu nó có quyền truy cập vào các biến bên ngoài ở vị trí mới không?

Hãy mở rộng kiến ​​thức của chúng ta để hiểu những tình huống này và những tình huống phức tạp hơn

Chúng ta sẽ nói về biến

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
3 ở đây

Trong JavaScript có 3 cách khai báo biến.

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
4,
{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
5 [hiện đại], và
{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
6 [tàn dư của quá khứ]

  • Trong bài viết này, chúng tôi sẽ sử dụng biến
    {
      // show message
      let message = "Hello";
      alert[message];
    }
    
    {
      // show another message
      let message = "Goodbye";
      alert[message];
    }
    4 trong các ví dụ
  • Các biến, được khai báo với
    {
      // show message
      let message = "Hello";
      alert[message];
    }
    
    {
      // show another message
      let message = "Goodbye";
      alert[message];
    }
    5, hoạt động giống nhau, vì vậy bài viết này cũng về
    {
      // show message
      let message = "Hello";
      alert[message];
    }
    
    {
      // show another message
      let message = "Goodbye";
      alert[message];
    }
    5
  • {
      // show message
      let message = "Hello";
      alert[message];
    }
    
    {
      // show another message
      let message = "Goodbye";
      alert[message];
    }
    6 cũ có một số điểm khác biệt đáng chú ý, chúng sẽ được đề cập trong bài viết "var" cũ

khối mã

Nếu một biến được khai báo bên trong khối mã

31, thì nó chỉ hiển thị bên trong khối đó

Ví dụ

4

Chúng ta có thể sử dụng điều này để cô lập một đoạn mã thực hiện nhiệm vụ riêng của nó, với các biến chỉ thuộc về nó

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}

Sẽ có lỗi nếu không có khối

Xin lưu ý, nếu không có các khối riêng biệt, sẽ có lỗi, nếu chúng tôi sử dụng

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
4 với tên biến hiện có

3

Đối với

33, 
34, 
35, v.v., các biến được khai báo trong 
31 cũng chỉ hiển thị bên trong

2

Ở đây, sau khi

33 kết thúc, 
38 bên dưới sẽ không nhìn thấy 
39, do đó xảy ra lỗi

Điều đó thật tuyệt, vì nó cho phép chúng tôi tạo các biến khối cục bộ, dành riêng cho nhánh

33

Điều tương tự cũng đúng với các vòng lặp

34 và 
35

9

Trực quan,

23 nằm ngoài 
31. Nhưng cấu trúc 
34 đặc biệt ở đây. biến, được khai báo bên trong nó, được coi là một phần của khối

hàm lồng nhau

Một chức năng được gọi là “lồng nhau” khi nó được tạo bên trong một chức năng khác

Có thể dễ dàng làm điều này với JavaScript

Chúng ta có thể sử dụng nó để sắp xếp mã của mình, như thế này

      
           
   

3

Ở đây, hàm lồng nhau

26 được tạo để thuận tiện. Nó có thể truy cập các biến bên ngoài và do đó có thể trả về tên đầy đủ. Các hàm lồng nhau khá phổ biến trong JavaScript

Điều thú vị hơn nhiều, một hàm lồng nhau có thể được trả về. hoặc là một thuộc tính của một đối tượng mới hoặc là kết quả của chính nó. Sau đó nó có thể được sử dụng ở nơi khác. Bất kể ở đâu, nó vẫn có quyền truy cập vào các biến bên ngoài giống nhau

Dưới đây,

27 tạo hàm “bộ đếm” trả về số tiếp theo trên mỗi lệnh gọi

      
           
   

6

Mặc dù đơn giản, các biến thể được sửa đổi một chút của mã đó có những ứng dụng thực tế, chẳng hạn như một trình tạo số ngẫu nhiên để tạo các giá trị ngẫu nhiên cho các thử nghiệm tự động

Cái này hoạt động ra sao?

Hiểu những điều như vậy là rất tốt cho kiến ​​thức tổng thể về JavaScript và có lợi cho các tình huống phức tạp hơn. Vì vậy, hãy đi sâu một chút

Môi trường từ vựng

Đây là những con rồng

Phần giải thích kỹ thuật chuyên sâu nằm ở phía trước

Theo như tôi muốn tránh các chi tiết ngôn ngữ cấp thấp, bất kỳ sự hiểu biết nào nếu không có chúng sẽ thiếu sót và không đầy đủ, vì vậy hãy sẵn sàng

Để rõ ràng, giải thích được chia thành nhiều bước

Bước 1. Biến

Trong JavaScript, mọi chức năng đang chạy, khối mã

31 và toàn bộ tập lệnh đều có một đối tượng liên quan [ẩn] bên trong được gọi là Môi trường từ vựng

Đối tượng Lexical Environment bao gồm hai phần

  1. Bản ghi môi trường – một đối tượng lưu trữ tất cả các biến cục bộ làm thuộc tính của nó [và một số thông tin khác như giá trị của
    29]
  2. Tham chiếu đến môi trường từ vựng bên ngoài, môi trường được liên kết với mã bên ngoài

Một "biến" chỉ là một thuộc tính của đối tượng bên trong đặc biệt,

90. “Nhận hoặc thay đổi một biến” có nghĩa là “lấy hoặc thay đổi một thuộc tính của đối tượng đó”

Trong mã đơn giản này không có chức năng, chỉ có một Môi trường từ điển

Đây được gọi là Môi trường từ điển toàn cầu, được liên kết với toàn bộ tập lệnh

Ở hình trên, hình chữ nhật có nghĩa là Bản ghi môi trường [lưu trữ biến] và mũi tên có nghĩa là tham chiếu bên ngoài. Môi trường từ điển toàn cầu không có tham chiếu bên ngoài, đó là lý do tại sao mũi tên chỉ tới

91

Khi mã bắt đầu thực thi và tiếp tục, Môi trường từ vựng sẽ thay đổi

Đây là đoạn mã dài hơn một chút

Hình chữ nhật ở phía bên tay phải thể hiện cách Môi trường từ điển toàn cầu thay đổi trong quá trình thực thi

  1. Khi tập lệnh bắt đầu, Môi trường từ vựng được điền trước với tất cả các biến đã khai báo
    • Ban đầu, chúng ở trạng thái “Uninitialized”. Đó là một trạng thái bên trong đặc biệt, nó có nghĩa là engine biết về biến, nhưng nó không thể được tham chiếu cho đến khi nó được khai báo với
      {
        // show message
        let message = "Hello";
        alert[message];
      }
      
      {
        // show another message
        let message = "Goodbye";
        alert[message];
      }
      4. Nó gần giống như thể biến không tồn tại
  2. Sau đó, định nghĩa
    93 xuất hiện. Chưa có nhiệm vụ nào, vì vậy giá trị của nó là 
    94. Chúng ta có thể sử dụng biến từ thời điểm này trở đi
  3. 39 được gán một giá trị
  4. 39 thay đổi giá trị

Mọi thứ có vẻ đơn giản cho bây giờ, phải không?

  • Biến là một thuộc tính của một đối tượng bên trong đặc biệt, được liên kết với khối/chức năng/tập lệnh hiện đang thực thi
  • Làm việc với biến thực chất là làm việc với thuộc tính của đối tượng đó

Lexical Environment là một đối tượng đặc tả

“Môi trường từ điển” là một đối tượng đặc tả. nó chỉ tồn tại “về mặt lý thuyết” trong đặc tả ngôn ngữ để mô tả cách mọi thứ hoạt động. Chúng tôi không thể lấy đối tượng này trong mã của mình và thao tác trực tiếp với nó

Các công cụ JavaScript cũng có thể tối ưu hóa nó, loại bỏ các biến không được sử dụng để tiết kiệm bộ nhớ và thực hiện các thủ thuật nội bộ khác, miễn là hành vi hiển thị vẫn như mô tả

Bước 2. Khai báo hàm

Một chức năng cũng là một giá trị, giống như một biến

Sự khác biệt là Khai báo hàm được khởi tạo đầy đủ ngay lập tức

Khi một Môi trường từ vựng được tạo, một Khai báo hàm ngay lập tức trở thành một hàm sẵn sàng sử dụng [không giống như

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
4, không thể sử dụng được cho đến khi khai báo]

Đó là lý do tại sao chúng ta có thể sử dụng một hàm, được khai báo là Khai báo hàm, ngay cả trước khi chính khai báo đó

Ví dụ, đây là trạng thái ban đầu của Global Lexical Environment khi chúng ta thêm một hàm

Đương nhiên, hành vi này chỉ áp dụng cho Khai báo Hàm, không áp dụng cho Biểu thức Hàm nơi chúng ta gán một hàm cho một biến, chẳng hạn như

98

Bước 3. Môi trường từ vựng bên trong và bên ngoài

Khi một chức năng chạy, khi bắt đầu cuộc gọi, một Môi trường từ điển mới được tạo tự động để lưu trữ các biến cục bộ và tham số của cuộc gọi

Chẳng hạn, đối với

99, nó trông như thế này [việc thực thi nằm ở dòng, được đánh dấu bằng một mũi tên]

Trong khi gọi hàm, chúng ta có hai Môi trường từ điển. cái bên trong [đối với lệnh gọi hàm] và cái bên ngoài [toàn cầu]

  • Môi trường Lexical bên trong tương ứng với việc thực thi hiện tại của
          
               
       
    
    
    30. Nó có một tài sản duy nhất.
          
               
       
    
    
    31, đối số chức năng. Chúng tôi đã gọi
    99, vì vậy giá trị của 
          
               
       
    
    
    31 là
          
               
       
    
    
    34
  • Lexical Environment bên ngoài là Lexical Environment toàn cầu. Nó có biến
    39 và chính hàm

Môi trường Lexical bên trong có một tham chiếu đến

      
           
   

36

Khi mã muốn truy cập một biến – Môi trường từ vựng bên trong được tìm kiếm trước, sau đó đến môi trường bên ngoài, rồi đến môi trường bên ngoài hơn, v.v. cho đến môi trường toàn cầu

Nếu không tìm thấy biến ở bất kỳ đâu, thì đó là lỗi ở chế độ nghiêm ngặt [không có

      
           
   

37, việc gán cho một biến không tồn tại sẽ tạo ra một biến toàn cục mới, để tương thích với mã cũ]

Trong ví dụ này, quá trình tìm kiếm diễn ra như sau

  • Đối với biến
          
               
       
    
    
    31,
    38 bên trong 
          
               
       
    
    
    30 tìm thấy nó ngay lập tức trong Lexical Environment bên trong
  • Khi nó muốn truy cập
    39, thì không có 
    39 cục bộ, vì vậy nó sẽ theo tham chiếu đến Lexical Environment bên ngoài và tìm thấy nó ở đó

Bước 4. Trả về một chức năng

Hãy quay lại ví dụ về

27

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
3

Khi bắt đầu mỗi lệnh gọi

      
           
   

64, một đối tượng Môi trường Lexical mới được tạo để lưu trữ các biến cho lần chạy
27 này

Vì vậy, chúng tôi có hai Môi trường từ vựng lồng nhau, giống như trong ví dụ trên

Điều khác biệt là, trong quá trình thực thi

      
           
   

64, một hàm lồng nhau nhỏ được tạo chỉ bằng một dòng.
      
           
   

67. Chúng tôi chưa chạy nó, chỉ tạo

Tất cả các chức năng ghi nhớ Môi trường từ điển mà chúng được tạo ra. Về mặt kỹ thuật, không có phép thuật nào ở đây. tất cả các hàm đều có thuộc tính ẩn tên là

      
           
   

68, giữ tham chiếu đến Môi trường từ vựng nơi hàm được tạo

Vì vậy,

      
           
   

69 có tham chiếu đến
{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
30 Lexical Environment. Đó là cách chức năng nhớ nơi nó được tạo, bất kể nó được gọi ở đâu. Tham chiếu
      
           
   

68 được đặt một lần và mãi mãi tại thời điểm tạo chức năng

Sau đó, khi

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
32 được gọi, một Môi trường từ điển mới được tạo cho cuộc gọi và tham chiếu Môi trường từ điển bên ngoài của nó được lấy từ
      
           
   

69

Bây giờ, khi mã bên trong

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
32 tìm kiếm biến
{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
35, đầu tiên nó tìm kiếm Môi trường từ điển của chính nó [trống, vì không có biến cục bộ nào ở đó], sau đó là Môi trường từ vựng của lệnh gọi
      
           
   

64 bên ngoài, nơi nó tìm và thay đổi nó

Một biến được cập nhật trong Lexical Environment nơi nó tồn tại

Đây là trạng thái sau khi thực hiện

Nếu chúng ta gọi

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
32 nhiều lần, biến
{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
35 sẽ được tăng lên thành
{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
39,
{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
00, v.v., tại cùng một vị trí

Khép kín

Có một thuật ngữ lập trình chung là “đóng cửa”, mà các nhà phát triển nói chung nên biết

Bao đóng là một hàm ghi nhớ các biến bên ngoài của nó và có thể truy cập chúng. Ở một số ngôn ngữ, điều đó là không thể hoặc một chức năng phải được viết theo cách đặc biệt để thực hiện. Nhưng như đã giải thích ở trên, trong JavaScript, tất cả các hàm đều là các hàm đóng một cách tự nhiên [chỉ có một ngoại lệ, được trình bày trong cú pháp "Hàm mới"]

Đó là. họ tự động ghi nhớ nơi chúng được tạo bằng cách sử dụng thuộc tính

      
           
   

68 ẩn và sau đó mã của họ có thể truy cập các biến bên ngoài

Khi tham gia một cuộc phỏng vấn, một nhà phát triển giao diện người dùng nhận được câu hỏi về “đóng cửa là gì?”, một câu trả lời hợp lệ sẽ là định nghĩa về đóng cửa và giải thích rằng tất cả các chức năng trong JavaScript đều là đóng cửa và có thể thêm một vài từ về chi tiết kỹ thuật. thuộc tính

      
           
   

68 và cách thức hoạt động của Môi trường từ điển

Thu gom rác thải

Thông thường, một Môi trường từ điển sẽ bị xóa khỏi bộ nhớ cùng với tất cả các biến sau khi lệnh gọi hàm kết thúc. Đó là bởi vì không có tài liệu tham khảo cho nó. Giống như bất kỳ đối tượng JavaScript nào, nó chỉ được lưu trong bộ nhớ khi có thể truy cập được

Tuy nhiên, nếu có một hàm lồng nhau vẫn có thể truy cập được sau khi kết thúc hàm, thì hàm đó có thuộc tính

      
           
   

68 tham chiếu đến môi trường từ vựng

Trong trường hợp đó, Môi trường từ điển vẫn có thể truy cập được ngay cả sau khi hoàn thành chức năng, vì vậy nó vẫn tồn tại

Ví dụ

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
0

Xin lưu ý rằng nếu

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
04 được gọi nhiều lần và các hàm kết quả được lưu, thì tất cả các đối tượng Môi trường từ điển tương ứng cũng sẽ được giữ lại trong bộ nhớ. Trong đoạn mã dưới đây, cả 3 người trong số họ

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
6

Một đối tượng Lexical Environment chết khi không thể truy cập được [giống như bất kỳ đối tượng nào khác]. Nói cách khác, nó chỉ tồn tại khi có ít nhất một hàm lồng nhau tham chiếu đến nó.

Trong mã bên dưới, sau khi hàm lồng nhau bị xóa, Môi trường từ vựng kèm theo của nó [và do đó là

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
05] được xóa khỏi bộ nhớ

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
0

Tối ưu hóa thực tế

Như chúng ta đã thấy, theo lý thuyết, khi một hàm còn hoạt động, tất cả các biến bên ngoài cũng được giữ lại

Nhưng trên thực tế, các công cụ JavaScript cố gắng tối ưu hóa điều đó. Họ phân tích việc sử dụng biến và nếu mã rõ ràng rằng một biến bên ngoài không được sử dụng – nó sẽ bị xóa

Một tác dụng phụ quan trọng trong V8 [Chrome, Edge, Opera] là biến đó sẽ không khả dụng khi gỡ lỗi

Hãy thử chạy ví dụ bên dưới trong Chrome khi mở Công cụ dành cho nhà phát triển

Khi nó tạm dừng, trong bảng điều khiển gõ

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
06

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
1

Như bạn có thể thấy - không có biến như vậy. Về lý thuyết, nó có thể truy cập được, nhưng công cụ đã tối ưu hóa nó

Điều đó có thể dẫn đến các vấn đề gỡ lỗi buồn cười [nếu không muốn nói là tốn thời gian]. Một trong số đó – chúng ta có thể thấy một biến ngoài cùng tên thay vì biến như mong đợi

{
  // show message
  let message = "Hello";
  alert[message];
}

{
  // show another message
  let message = "Goodbye";
  alert[message];
}
2

Tính năng này của V8 thì hay biết. Nếu bạn đang debug với Chrome/Edge/Opera thì sớm muộn cũng gặp thôi

Đó không phải là lỗi trong trình gỡ lỗi, mà là một tính năng đặc biệt của V8. Có lẽ nó sẽ được thay đổi đôi khi. Bạn luôn có thể kiểm tra nó bằng cách chạy các ví dụ trên trang này

Làm cách nào để giữ lại một giá trị trong JavaScript?

Để giữ lại giá trị đã chọn trong danh sách thả xuống khi làm mới, sessionStorage được sử dụng để lưu trữ giá trị trong trình duyệt của người dùng . Đầu tiên, các giá trị phải được đặt bằng sessionStorage. setItem[“SelItem”, selVal]; .

Làm cách nào để giữ lại giá trị biến toàn cầu trong JavaScript?

Khi gọi hàm 'cạnh huyền', giá trị của 'x' thay đổi từ 1. Sửa nó để 'x' vẫn là 1 trong phạm vi toàn cầu. var x = 1; . sqrt[cSquared];

Làm thế nào bạn có thể lưu các giá trị trong một biến?

Bạn lưu trữ một giá trị trong một biến bằng cách đặt tên biến ở phía bên trái của câu lệnh gán .

Biến $ trong JavaScript là gì?

Biến JavaScript chỉ đơn giản là tên của vị trí lưu trữ . Có hai loại biến trong JavaScript. biến cục bộ và biến toàn cục. Có một số quy tắc khi khai báo biến JavaScript [còn được gọi là định danh]. Tên phải bắt đầu bằng một chữ cái [a đến z hoặc A đến Z], dấu gạch dưới [ _ ] hoặc ký hiệu đô la [$ ].

Chủ Đề