Tại sao let và const không được khởi tạo trong Javascript? – JavaScript


Xin chào, các trại viên! Mong bạn làm việc tốt!

LƯU Ý: Tôi muốn xin lỗi về tiếng Anh của mình, tôi đã sử dụng Grammarly để khắc phục một số vấn đề, nhưng không chắc liệu mọi thứ ở đây có chính xác hay không.

Tôi đang vật lộn với hoisting trong Javascript!

Tôi hiểu cách cẩu hoạt động trong JS.

  • Tôi biết rằng tất cả các khai báo đều được nâng lên trong Javascript. (Không chỉ var)
  • Tôi biết rằng các biến var được đặt thành “không xác định”, trong khi let và const không được khởi tạo với giá trị mặc định.

Vì vậy, câu hỏi của tôi là: Tại sao nó như thế này?

Ý tôi là, tại sao let và const không được khởi tạo? Có một số lý do khôn ngoan đằng sau tính năng/hành vi này? Hay đó chỉ là một quyết định được đưa ra bởi người tạo JS?

Dựa trên nghiên cứu của tôi, tôi có một lý thuyết về lý do tại sao const không được khởi tạo.
Về cơ bản, một const phải có một mã định danh và một giá trị trong cùng một dòng, nếu không, nó sẽ không chính xác:
const consName = giá trị;

Vì vậy, thật hợp lý khi công cụ JS đưa ra lỗi cú pháp khi cố gắng truy cập một biến const (tôi biết, nó là hằng số :)) bởi vì cú pháp của nó sai ngay từ đầu.

Tôi không biết liệu lý thuyết của tôi ở đây có đúng không, nhưng nó có vẻ hợp lý.

Tôi không thể tìm thấy lời giải thích tại sao let không được khởi tạo.

Tôi đánh giá cao bất kỳ lời giải thích nào cho hiện tượng này, với tư cách là một giáo viên, điều thực sự quan trọng đối với tôi là hiểu mọi thứ hoạt động bí mật như thế nào.
Trân trọng,
Moh

Đọc thêm  Tính bất biến của JavaScript – Các đối tượng bị đóng băng trong JS được giải thích bằng các ví dụ


bởi vì nó tránh hành vi này

console.log(a)

var a = 9;

Chúng ta có thể sử dụng một var biến trước khi khởi tạo mà không gặp sự cố.

hình ảnh

console.log(b);

let b = 4;

Ở đây nó cho tôi biết rằng b không được xác định
hình ảnh

Tôi không nghĩ rằng điều này là đúng. Chà, nó phụ thuộc vào ý nghĩa của bạn là nâng lên như thế nào. Let và const không được nâng lên theo cách của var.


Làm cách nào để công cụ Javascript biết bạn muốn đoán giá trị nào nếu bạn không khởi tạo biến? Có vô số dự đoán có thể xảy ra, đặc biệt là khi các khai báo biến không được nhập bằng Javascript.

  1. const phải được khởi tạo, không làm như vậy là một lỗi cú pháp.

  2. let được khởi tạo thành undefined khi được đánh giá (nếu không có giá trị ban đầu nào được đưa ra).

Nếu một LexicalBinding trong một let khai báo không có Trình khởi tạo, biến được gán giá trị không xác định khi LexicalBinding được đánh giá.

MDN: Vùng chết tạm thời (TDZ)

https://tc39.es/ecma262/multipage/ecmascript-lingu-statements-and-declarations.html#sec-let-and-const-declarations

Vì vậy, “Nó tránh được điều này”, có nghĩa là việc khởi tạo một biến thành không xác định không phải là điều tốt, và đó là lý do tại sao họ thêm let và const vào nơi chúng không được khởi tạo thành không xác định?

Nếu tôi hiểu chính xác, có phải những người tạo JavaScript đã làm như vậy để làm cho nó giống như các ngôn ngữ khác, nơi bạn không thể sử dụng một biến trước khi khởi tạo nó?

Đọc thêm  Cách kiểm tra xem Chuỗi JavaScript có phải là URL hợp lệ không

cho phép var Palăng (hoặc tệ hơn là không được khai báo!) và được sử dụng trước khi nó được xác định hoặc có giá trị được gán đã tạo ra một loạt lỗi khó hiểu, vì vậy letconst đã được thêm vào ngôn ngữ để cung cấp cho người dùng các công cụ để tránh những vấn đề này.



2 lượt thích

Tất cả các biến được nâng lên theo MDN.
Trích dẫn:
Các biến được khai báo với letconst cũng được nâng lên nhưng, không giống như var , không được khởi tạo với giá trị mặc định. Một ngoại lệ sẽ được đưa ra nếu một biến được khai báo với let hoặc const được đọc trước khi nó được khởi tạo. Kết thúc trích dẫn.

Nhưng tôi hiểu ý của bạn. Cuối cùng, let và const được xử lý theo cách khiến chúng dường như không được nâng lên.

Vì vậy, một lần nữa, có vẻ như let và const không được nâng lên giống như var vì những người tạo JS muốn làm cho JS hoạt động giống như các ngôn ngữ khác mà bạn phải khởi tạo các biến trước khi sử dụng chúng? Tôi là tôi ở ngay đây?

Tôi nghĩ điều này chỉ hoạt động với var…

Vùng chết tạm thời thật kỳ lạ. Nhìn vào liên kết ở trên.

Hành vi thú vị này là do JavaScipt vá một số hành vi đáng ngạc nhiên của var với cư xử tốt hơn letconst.

Chính xác! Cho đến bây giờ, tôi đã hiểu rằng let và const được thêm vào đâu để sửa lỗi var.

Đọc thêm  Cách phát hiện bảng màu ưa thích của người dùng trong JavaScript

Tuy nhiên, vì chúng không hoạt động giống như var khi truy cập chúng trước khi khai báo chúng, thuật ngữ TDZ đã được giới thiệu.

Nó lạ đối với tôi vì tôi có một số kinh nghiệm với Java và toàn bộ vấn đề sử dụng một biến trước khi khai báo nó THỰC SỰ lạ.

Biến chưa được khởi tạo (hay còn gọi là TDZ)

Sự khác biệt thực tế là let /const khai báo không tự động khởi tạo ở đầu phạm vi, cách var làm. Các tranh luận sau đó là nếu tự động khởi tạo là một phần của cẩu, hay không? Tôi nghĩ rằng đăng ký tự động của một biến ở đầu phạm vi (nghĩa là cái mà tôi gọi là “nâng”) và tự động khởi tạo ở đầu phạm vi (để undefined ) là các hoạt động riêng biệt và không được gộp lại với nhau dưới một thuật ngữ duy nhất là “ cẩu”.

Phụ lục A: Thỏa thuận với TDZ là gì?

Hơi khó để tìm bối cảnh lịch sử nhưng đây là một số tôi đã tìm thấy.

https://mail.mozilla.org/pipermail/es-discuss/2011-August/016188.html


Đây là một lời giải thích khác về nó từ một thành viên TC39.



1 lượt thích

Bạn là một người đóng góp tuyệt vời thực sự! Cảm ơn bạn rất nhiều cho câu trả lời này.

Và cảm ơn tất cả các bạn! Tôi đã học được nhiều điều từ mỗi người trong số các bạn!



1 lượt thích



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status