2016-11-14 24 views
9

Tại sao trình duyệt nhận được Symbol.unscopables hai lần?

with(new Proxy({}, { 
 
    has() { return true }, 
 
    get(obj, key, proxy) { return console.log(String(key)) } }) 
 
) { 
 
    a-- 
 
}

Output trong Chrome:

Symbol(Symbol.unscopables) 
a 
Symbol(Symbol.unscopables) 

Output trong Firefox:

Symbol(Symbol.unscopables) 
Symbol(Symbol.unscopables) 
a 

Theo tôi được biết, một trong những việc có liên quan đến việc đọc giá trị và người kia - để gán .

Hợp lý là a-- nên viết thư đến cùng một nơi mà a được đọc từ đó. Không, không phải.

Nhưng nhận được giá trị cho Symbol.unscopables hai lần gợi ý cho chúng tôi, có thể vượt qua một đối tượng để đọc và một đối tượng khác để viết.

Thực sự có ý nghĩa để làm việc như vậy không? Đặc điểm kỹ thuật nói gì?

Trên thực tế, nó gần như làm việc trong Chrome và FF - nó có thể đọc từ một obect và viết thành một trong những khác, nhưng nó dẫn đến kết quả khác nhau:

Cập nhật: Safari 10 lần đọc nó một lần duy nhất.

var a, b, flag = true 
 

 
with (a = { x: 7 }) 
 
    with (b = { x: 4, get [Symbol.unscopables]() { return { x: flag=!flag } } }) 
 
    x++ 
 

 
       // Chrome FF  Safari Edge 
 
console.log(a) // {x:5} {x:7} {x:7} {x:5} 
 
console.log(b) // {x:4} {x:8} {x:5} {x:4}

PS: Same question in Russian

+4

Tại sao bạn đã bao giờ trộn các tính năng 'with' và hiện đại? 'with' sẽ không hiển thị trong JS thành ngữ. – ssube

+1

@ssube, bạn thậm chí có thể hỏi tại sao tôi thay đổi 'unscopables' động, nhưng tôi chỉ quan tâm làm thế nào nó sẽ làm việc. Không có bất kỳ ví dụ thực tế nào. Có lẽ chỉ ở đâu đó cho các cuộc thi codegolf :) – Qwertiy

+0

@Gothdo, nó không liên quan đến proxy. Proxy chỉ hiển thị rõ ràng, rằng giá trị được lấy hai lần. Nhưng ví dụ sau này hoạt động mà không có bất kỳ proxy nào. – Qwertiy

Trả lời

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