nhầm lẫn về khai báo hàm trong {}


18

var a;
if (true) {
  a = 5;

  function a() {}
  a = 0;
  console.log(a)
}
console.log(a)

Tôi thấy mã ở trên, một hàm được khai báo trong {}. Tôi nghĩ rằng nó sẽ in 0 0, nhưng nó in 0 5


Điều này có trả lời câu hỏi của bạn không? Các ngữ nghĩa chính xác của các hàm cấp khối trong ES6 là gì?
Jonas Wilms

1
Trong chế độ nghiêm ngặt, nó đăng nhập 0 undefined.
SurePerformance

@certainPerformance tốt, điều đó có thể giải thích được, nhưng tôi không giải thích được rằng a = 5rời khỏi khối. Theo bergi trong bản dupe, function asẽ được nâng lên.
Jonas Wilms

2
Có vẻ như nếu biến khối phạm vi cục bộ được sao chép sang khối bên ngoài khi đạt đến khai báo hàm.
Jonas Wilms

Câu trả lời:


13

Sau đây xảy ra:

(1) Tồn tại hai khai báo biến a, một bên trong khối và một bên ngoài khối.

(2) Khai báo hàm được nâng lên và ràng buộc với biến khối bên trong.

(3) a = 5đạt được, ghi đè biến khối.

(4) khai báo hàm đạt được và biến khối được sao chép sang biến ngoài. Cả hai đều 5 tuổi.

(5) a = 0đạt được, ghi đè biến khối. Biến ngoài không bị ảnh hưởng bởi điều này.

 var a¹;
 if (true) {
   function a²() {} // hoisted
   a² = 5;
   a¹ = a²; // at the location of the declaration, the variable leaves the block      
   a² = 0;
  console.log(a²)
}
console.log(a¹);

Đây thực sự không phải là một phần của đặc tả kỹ thuật, nó là một phần của ngữ nghĩa tương thích di sản web , vì vậy đừng khai báo các hàm bên trong các khốiđừng dựa vào mã này để hành xử theo cách này .

Điều này cũng được giải thích ở đây


Nhưng tại sao một khi khai báo hàm đạt được, biến khối sẽ được sao chép sang biến ngoài? Kết luận đó từ trình gỡ lỗi?
Chor

@Chor không, thông số kỹ thuật nói như vậy. Tôi không biết tại sao.
Jonas Wilms
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.