带有块范围变量的 Safari 错误?

Safari bug with block scoped variables?

提问人:RobG 提问时间:3/13/2018 最后编辑:BergiRobG 更新时间:3/13/2018 访问量:1194

问:

我正在测试块范围是否可以用来替换 IIFE,以通过闭包创建“私有”变量。在 Safari 11.0.3 (11604.5.6.1.1) 中测试之前,它进展顺利,它支持块范围,但存在块和闭包的错误,例如:

{
  let i = 0;
  function getNext() {
    return i++;
  }
}
// Chrome and Firefox
console.log(getNext()); // 0
console.log(getNext()); // 1
// Safari
console.log(getNext()); // ReferenceError: Can't find variable: i

除了继续使用 IIFE 之外,还有其他解决方法吗?还是 Safari 正确,其他人都有错误?

在严格模式下,getNext 也不会在块外定义。

JavaScript 范围 Safari 闭包让

评论

1赞 Bergi 3/13/2018
哦,这绝对是一个 Safari 错误。作为金徽章持有者,你怎么能这么问呢?:P
2赞 Mark 3/13/2018
有趣。将函数定义为 似乎有效。我想知道这是否是吊装问题而不是范围问题。var getNext = function() { return i++; }
0赞 Bergi 3/13/2018
@Mark_M天哪,我怎么会没有注意到呢?Web-compat 块范围函数声明的奇怪半吊起可能是罪魁祸首,看起来这在 Safari 中没有正确实现。@Rob ,只需修复您的代码并编写它,使其在严格模式下有效:-)
0赞 RobG 3/13/2018
@Bergi——真的只是想发布它,因为它很奇怪。看到有人说“IIFE 不好,块范围好”,但在我看来 IIFE 不会去任何地方。
0赞 RobG 3/13/2018
@Mark_M—使用 var 和函数表达式似乎可以解决问题(在两种模式下),想让它成为答案吗?可能需要指出,函数声明在严格模式下是块范围的,但变量声明不是。

答: 暂无答案