爲什麼瀏覽器會得到兩次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}
爲什麼你會永遠混'with'和現代化的特點是什麼? 'with'不會出現在慣用的JS中。 – ssube
@ssube,你甚至可以問我爲什麼要動態更改'unscopables',但我只是感興趣它應該如何工作。沒有任何現實生活中的例子。也許只是代碼比賽的某個地方:) – Qwertiy
@Gothdo,它與代理無關。代理只是明確表示,該值需要兩次。但後來的例子沒有任何代理工作。 – Qwertiy