2016-12-29 15 views
9

mở dev console (hoặc trong Node.js), nhập đoạn mã sau bởi chuỗi:Giới thiệu về var/const, tại sao mã này sẽ hoạt động?

a = 1 
var a = 2 
const a = 3 

screenshot1

Như bạn có thể nhìn thấy nó hoạt động, nhưng nếu bạn nhập tất cả các mã cùng một lúc, bạn sẽ gặp phải lỗi, mà tôi nghĩ là hợp lý hơn screenshot2

tôi đoán sự khác biệt chỉ là cẩu, nếu bạn nhập vào tất cả các mã cùng một lúc, nó sẽ được coi như:

var a 
a = 1 
a = 2 
const a = 3 

Nhưng tôi không hiểu tại sao nó hoạt động khi bạn nhập từng dòng, còn nếu bạn bỏ qua những dòng đầu tiên, bạn nhận được một lỗi như mong đợi

enter image description here

+0

hành vi Thú vị! Bạn có thể phơi bày một số hành vi cụ thể của môi trường console. –

+0

@AndyRay Tôi đã thử trong node.js và trình duyệt khác, tôi nhận được kết quả tương tự – CodinCat

+4

Tôi có thể tưởng tượng rằng trong trường hợp đầu tiên 'var' thực sự bị bỏ qua vì đã có thuộc tính trên đối tượng chung với tên' a' (vì 'a = 1'). Bởi vì không có bất kỳ thông tin nào mà 'var a' được khai báo. Như bạn chỉ ra trong trường hợp thứ hai, 'var a' được hoisted, do đó được xử lý trước khi' a = 1' xảy ra, do đó, nó không bị bỏ qua. Nhưng đó là suy đoán, giao diện điều khiển/REPL môi trường có thể làm những điều kỳ lạ. –

Trả lời

1

Trong phạm vi toàn cầu của môi trường một biến có thể được chỉ định và khai báo không phân biệt loại, do đó khi bạn nhập mã sau theo thứ tự, nó hoạt động.

z = 1 
var z = 2 
const z = 3 

giá trị của z là 3 bây giờ

Bây giờ cho phép nói rằng chúng tôi thực hiện tất cả điều này cùng một lúc

z = 4; var z = 5; const z = 6; 

giá trị của z vẫn 3

là người phiên dịch trong trường hợp này sẽ ném lỗi vì ở đây nó sẽ cố gắng thực hiện tất cả các câu lệnh trên một lần như một khối và bây giờ nó đã tìm thấy nhiều khai báo cho 'z' và do đó sẽ ném một lỗi cho toàn bộ khối và sẽ không thực hiện ngay cả những phần đầu tiên tức là z = 4;

tuyên bố nơi mà mọi thứ được thực hiện cùng một lúc là tương đương với

(function foo(){ z = 4; var z = 5; const z = 6; })(); 
+2

Bạn có thể nhận thấy một điều .. nếu chúng ta sử dụng công cụ dev để xác định biến 'a' nó gắn vào đối tượng cửa sổ và nếu bạn thêm 'const a' nó không thêm vào đối tượng cửa sổ ví dụ: var a = 2; bạn điền giá trị window.a là 2 và bạn nhập const a = 3; bạn vẫn nhận thấy rằng giá trị window.a vẫn giữ nguyên nghĩa là 2. – spankajd

+0

Vì vậy, về cơ bản nếu đặt tất cả trong một dòng là một phạm vi khối và const z không thể thay đổi làm bất cứ điều gì khác là z không hợp lệ. Nhưng nếu z được khai báo trên các dòng riêng biệt, mỗi dòng được coi là phạm vi riêng của nó để giá trị const không áp dụng cho chúng? – zer00ne

Các vấn đề liên quan