2011-12-30 44 views
6

Cả hai trường hợp, loại của biến sẽ là "không xác định". Nhưng biến không khai báo sẽ tăng ngoại lệ.Cách phân biệt giữa một biến không được khai báo và biến có thể được khai báo nhưng không được gán bất kỳ giá trị nào?

Có cách nào dễ dàng để xử lý việc này không?

+2

Bạn có thể chỉ định một số loại mẫu mã hoặc mô tả chi tiết hơn trong câu hỏi của mình không? – nmagerko

+1

Bạn có thể sử dụng toán tử 'in' để kiểm tra các biến được xác định (với giá trị' undefined') trong phạm vi toàn cục, hoặc trên các đối tượng. Nhưng không thể cho các biến cục bộ được tạo bên trong một hàm vì chúng không thể truy cập được theo chương trình. Xem [answer] của tôi (http://stackoverflow.com/a/3390426/165737) từ một chuỗi cũ hơn. Đối với các biến cục bộ được tạo bên trong một hàm bằng cách sử dụng khối 'try..catch' tìm kiếm một' ReferenceError' có vẻ là giải pháp duy nhất cũng được đề xuất trong câu trả lời được liên kết của @ pst. – Anurag

+1

Tại sao bạn đang cố gắng sử dụng các biến mà bạn chưa khai báo? Nếu bạn nhận được một 'ReferenceError', có nghĩa là đã đến lúc sửa một số mã. –

Trả lời

4

Bạn có thể tìm thấy câu hỏi (và câu trả lời của tôi) trong How to check if a variable or object is undefined? có liên quan. Nói chung, tôi xem số mọi truy cập truy cập vào biến "không được khai báo" một lỗi lập trình.

Tuy nhiên, trường hợp cụ thể chỉ có thể * được phát hiện với việc sử dụng phát hiện cho một ngoại lệ ReferenceError. Nhưng, yuck, yuck, yuck! Hãy nhớ rằng các khai báo biến là một cấu trúc từ vựng tĩnh , bỏ qua các quirks với các biến thuộc tính của đối tượng chung.

ReferenceError và hiện tại là "nghiêm ngặt", tồn tại vì một lý do và tôi nghi ngờ đây là sự cố X-Y. Tôi thậm chí không khuyên bạn nên sử dụng typeof cho mục đích này: sửa mã :-)

Mã hóa hạnh phúc.


* Người ta đã chỉ ra rằng "variable" in window cũng sẽ [và chỉ] làm việc cho "biến" toàn cầu (họ thực sự chỉ là tài sản mà không cần phải có đủ điều kiện trong mọi hoàn cảnh).

+0

+1 cho 'Tham chiếuError' và" nghiêm ngặt "tồn tại vì một lý do, cho vấn đề X-Y, và cho' typeof' không khuyến nghị. Vì vậy, tổng thể một +1 lớn! –

+0

Không thể tự mình làm tốt hơn. +1. –

0

Bạn có thể try:

var a; 
try { 
    a; 
    alert('a'); 
} catch(e) { /* a not defined */ } 
try { 
    b; 
    alert('b'); 
} catch(e) { /* b not defined */ } 
alert('done'); 

DEMO

0

Bạn không bao giờ nên cố gắng truy cập vars không khai báo nếu bạn đang viết JS sạch. Để tránh những cạm bẫy như vậy (trong số nhiều người khác) bắt đầu LINTing JS của bạn với http://www.jslint.com/ hoặc http://jshint.com/.

Đọc tốt để giúp bạn hiểu các công cụ LINT và lý do đằng sau phát hiện của họ là Sách của Crockford, JavaScript: Phần tốt (http://www.amazon.com/gp/aw/d/0596517742).

1

nếu thuộc tính chúng tôi muốn kiểm tra trong đối tượng cho dù nó tồn tại hay không, ngay cả khi nó không xác định.

chúng tôi sẽ sử dụng một trong những: 'chống đỡ' trong obj (để kiểm tra tính từ chuỗi nguyên mẫu) hoặc obj.hasOwnProperty ('chống đỡ')

chúng ta cần phải sử dụng phương pháp trên để kiểm tra xem thuộc tính có tồn tại hay không khi truy cập thuộc tính chưa được khai báo trong đối tượng cũng sẽ trả về không xác định.

var o={}; 
o.c=undefined; 
o.c===undefined; //is true 
o.a===undefined; //is true as well even though c exists while a doesn't 

thường không phải là một vấn đề như không ai thực sự kê khai tài sản không xác định nhiều, nhưng khi làm như vậy làm điều đó như thế này.

o.c=''; //when it can be string or 
o.c=null; //to clearly indicate that its nothing. 
then 
o.c === undefined will return false! 
note!!! 
null == undefined //true while 
null === undefined //false that's why use three equals to test 

Đối với các biến không được khai báo và không nằm trong đối tượng. Khi được truy cập Trình biên dịch sẽ trả về lỗi (tham chiếu). Nếu nó không có nghĩa là nó được coi là tài sản toàn cầu, đối tượng cửa sổ thuộc tính và không được khai báo, ít nhất là trong tất cả phạm vi gốc, vì vậy nó sẽ không được xác định giống như o.a ở trên cùng. nó sẽ trở thành window.prop.

so x; //error 
but x=3; //no error assumed to be global object. 
just like o.abcd = 3; would... 
make(declare) a property abcd in object o valued(assigned) 3 all at once. 

Để tránh tính để trở thành một biến toàn cầu, chúng tôi sử dụng var từ khóa bên trong chức năng, như var k;

Một điều này bạn có thể làm gì về đánh bắt này lỗi tham khảo khi ném cho một biến điều đó không' t tồn tại và được cho là một biến.

try { 
x 
} catch(e){//code to run when x is not declared let alone defined.} 
Các vấn đề liên quan