javascript - 为什么浏览器会两次获取 Symbol.unscopables?

标签 javascript ecmascript-6 with-statement

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

据我了解,一个获取与阅读值(value)相关,另一个与分配相关。

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}

附言:Same question in Russian

最佳答案

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

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

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

关于javascript - 为什么浏览器会两次获取 Symbol.unscopables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40595389/

相关文章:

sql-server - TSQL 多次使用WITH定义的表

Python 用 "with statement"编写我的类

javascript - 为什么我重新访问页面时字体大小会发生变化

分配左侧的 Javascript 对象括号表示法 ({ Navigation } =)

ios - react-native UIExplorer 打不开

javascript - 当找到两个对象时,forEach 内部的过滤器无法正常工作

javascript - 在 react 中创建动态组件

javascript - 使用 <ul> 进行文本选择的不正确行为

javascript - 单击事件在触发一次 Backbone js 后停止工作

Python 'with' 命令