2015-06-25 24 views
7

Không giống như các biến var-tuyên bố truyền thống, được gắn liền với toàn bộ kèm theo, hoạt động phạm vi phân biệt nơi họ xuất hiện - let tờ khai đính kèm với phạm vi khối nhưng không được khởi tạo cho đến khi chúng xuất hiện trong khốiLàm cách nào để kiểm tra xem biến `let` đã được khai báo trên ES6 chưa?

Vì vậy:

console.log(a); // undefined 
console.log(b); // ReferenceError! 

var a; 
let b; 

Vì vậy, có vẻ như cẩu không được áp dụng ở đây.

Câu hỏi

Nếu vậy, làm thế nào tôi có thể an toàn kiểm tra xem biến đã được công bố?

NB - Tùy chọn tôi thấy là thử/nắm bắt và tất nhiên luôn đặt các biến số let đầu tiên ở phạm vi. nhưng câu hỏi của tôi vẫn là

+1

Bạn không thể kiểm tra xem có bất kỳ biến nào (hoặc 'let' hoặc' var') đã được khai báo hay không. Bạn chỉ có thể kiểm tra xem chúng đã được xác định chưa. Tại sao bạn vẫn cố gắng làm điều này? Trường hợp sử dụng của bạn là gì? –

+0

@AaditMShah Trường hợp đang học. với var tôi có thể làm: 'if (typeof a === 'undefined')' –

+3

Đã chỉnh sửa bình luận của tôi.Những gì bạn đang làm là kiểm tra xem biến đã được xác định chưa. Bạn không kiểm tra xem nó đã được khai báo chưa. –

Trả lời

8

có vẻ như cẩu không được áp dụng ở đây.

Không chính xác. Biến vẫn bao gồm phạm vi hoàn chỉnh, ràng buộc được tạo khi phạm vi được nhập giống như với var s.

Nhưng bạn nói đúng, trái ngược với var s nó không được khởi tạo ngay lập tức với undefined, chỉ khi tuyên bố let được đánh giá. Khu vực từ đầu phạm vi đến đó được gọi là vùng chết tạm thời - số nhận dạng bị ràng buộc, nhưng sẽ luôn ném một số ReferenceError khi được sử dụng.

Làm cách nào để kiểm tra xem biến có được khai báo một cách an toàn không?

Bạn không thể, giống như bạn không thể cho var s . Bạn không cần điều này anyway.

1: Hãy bỏ qua biến toàn cục trở thành thuộc tính của đối tượng chung ở đây.
2: var/function/function* biến được khai báo, ý tôi là. Các ràng buộc của Lexical (let, const) thực sự không trở thành các thuộc tính toàn cầu.

+0

Bergi: IMHO với 'var' I _can_ kiểm tra thông qua' typeof' (trừ trường hợp nó có giá trị không xác định 'var g = undefined') và cũng với' if ('x' trong cửa sổ) '(cho toàn cầu - không phải cho phạm vi.) –

+0

@RoyiNamir: Không chắc chắn ý bạn là gì, cũng như trường hợp sử dụng của bạn là gì. 'typeof x' luôn trả về' "undefined" 'nếu biến không tồn tại hoặc có giá trị' undefined'. Bất kể nó được khai báo hay không. – Bergi

+0

Bạn nói: _Bạn không thể, giống như bạn không thể cho vars_ - Tôi chỉ đề cập rằng tôi _can_ kiểm tra _existence_ của biến thông qua 'if ('a' trong cửa sổ) {..}' (nhưng nó sẽ chỉ hoạt động cho phạm vi toàn cục) –

3

Đó sẽ là gần nhất với những gì bạn đang tìm kiếm:

try { 
    console.log(typeof mima); // or any other use of variable 
    let mima = 'no ni ma'; 
} catch (error) { 
    console.log(error); // “Uncaught ReferenceError: mima is not defined(…)” 

    // and then taking some actions regarding the situation 
} 

Mặc dù, tính hữu dụng của nó là khá gây tranh cãi. Nhưng nếu tôi phải kiểm tra biến số ed của let ', tôi sẽ làm như vậy. Tuy nhiên, hãy nhớ rằng bạn không thể tạo biến bị thiếu một cách an toàn với let, vì nó được bao quanh bởi khối catch. Nhưng nó sẽ không phá vỡ mã.

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