2016-11-14 53 views
9

爲什麼瀏覽器會得到兩次Symbol.unscopables?

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

輸出在Chrome:

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

輸出在Firefox:

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

據我瞭解,一個得到的是與讀取值和其它 - 以分配。

a--應該寫入a被讀取的地方是合乎邏輯的。不,不是。

Symbol.unscopables獲得價值兩倍暗示我們,它是可能通過使用一個對象讀,另一個用於寫。

難道真的意味着這樣的工作嗎?規範說什麼?

事實上,它幾乎適用於Chrome和FF - 它可以從一個obect讀取和寫入到另一個,但它會導致不同的結果:

更新:Safari瀏覽器10讀取它只有一次。

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

爲什麼你會永遠混'with'和現代化的特點是什麼? 'with'不會出現在慣用的JS中。 – ssube

+1

@ssube,你甚至可以問我爲什麼要動態更改'unscopables',但我只是感興趣它應該如何工作。沒有任何現實生活中的例子。也許只是代碼比賽的某個地方:) – Qwertiy

+0

@Gothdo,它與代理無關。代理只是明確表示,該值需要兩次。但後來的例子沒有任何代理工作。 – Qwertiy

回答

相關問題