2012-02-05 33 views
6

Vui lòng xem xét hai đoạn mã (các bản in đầu tiên "eval địa phương", các bản in thứ hai "eval toàn cầu"):eval địa phương phân biệt từ eval toàn cầu

(function f() { 
    var x; 
    try { 
     eval("x"); 
     console.log('Local eval'); 
    } 
    catch (e) { 
     console.log('Global eval'); 
    } 
}()) 

var globalEval = eval; 
(function f() { 
    var x; 
    try { 
     globalEval("x"); 
     console.log('Local eval'); 
    } 
    catch (e) { 
     console.log('Global eval'); 
    } 
}()) 

Nó chỉ ra rằng mặc dù globalEval === eval đánh giá là true, globalEvalevalhoạt động khác nhau vì chúng có tên khác nhau. (Một eval chỉ có thể là cục bộ nếu nó được viết chính xác eval.)

Làm thế nào tôi có thể phân biệt với hai evals? Có cách nào để trích xuất các nhãn biến để suy luận về hành vi không?

+0

@MattiVirkkunen: Tôi đang cố gắng xây dựng một ví dụ về [this] (http://stackoverflow.com/questions/7223517/pure-function-given-strictly-equal-arguments-yielding-non-strictly-equal -các kết quả). Tôi thân thiết, nhưng chưa hoàn toàn ở đó. – Randomblue

+0

Tại sao bạn không chỉ gắn bó với [câu hỏi trước đây của bạn] (http://stackoverflow.com/questions/9145385/accessing-local-eval-inside-function-scope)? –

+0

@amnotiam: Đó là loại khác nhau, và tôi đã bối rối. Tôi ước tôi có thể xóa nó. – Randomblue

Trả lời

2

Thú vị. Nhưng kể từ khi bạn kiểm soát nơi/khi bạn tham chiếu đến eval được xác định, bạn có thể nói làm thế nào để phân biệt chúng. Ví dụ có một đối tượng có "con trỏ hàm" VÀ một cái gì đó để chỉ ra phạm vi - nếu bạn định nghĩa nó, bạn biết bạn đang đứng ở đâu.

I.e. myEvaluator.scope sẽ cho bạn biết thông tin về nơi phạm vi eval đã được captuerd và myEvaluator.eval có thể được sử dụng để đánh giá.