为什么浏览器会获得两次Symbol.unscopables?

Qwe*_*tiy 9 javascript with-statement ecmascript-6

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

Chrome中的输出:

Symbol(Symbol.unscopables)
a
Symbol(Symbol.unscopables)
Run Code Online (Sandbox Code Playgroud)

Firefox中的输出:

Symbol(Symbol.unscopables)
Symbol(Symbol.unscopables)
a
Run Code Online (Sandbox Code Playgroud)

据我所知,一个人获得与阅读价值相关 - 另一个 - 分配.

a--应该写入a读取的同一个地方是合乎逻辑的.不,这不对.

但是Symbol.unscopables两次获得价值提示我们,可以传递一个对象进行阅读,另一个对象进行写作.

它真的意味着像那样工作吗?规范说什么?

实际上,它几乎可以在Chrome和FF中运行 - 它可以从一个对象读取并写入另一个对象,但它会导致不同的结果:

更新: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}
Run Code Online (Sandbox Code Playgroud)

PS:俄语同样的问题

Bor*_*sky 4

据我所知,根据规范,@@unscopables 对于“x++”应该只读取一次。详情请参阅https://mail.mozilla.org/pipermail/es-discuss/2017-February/047725.html

所以 Chrome 和 Firefox 都存在 bug。Safari 做到了这一点。

另请参阅https://bugzilla.mozilla.org/show_bug.cgi?id=1341061https://bugs.chromium.org/p/v8/issues/detail?id=5992