有时JavaScript代码块会引发错误

厄普西隆

我正在使用代码块来模拟静态函数变量laC。这是基本设置:

{
    let bob = 5;
    function b() {
        console.log(bob++);
    }
}

现在在chrome中可以毫无问题地编译。但是在Safari中,

SyntaxError: Unexpected identifier 'bob'. Expected a ':' following the property name 'let'.

我不知道是什么原因导致此差异,因为Chrome和Safari都处理ECMAScript 6。

TJ人群

问题在于代码处于松散模式,并且您要在一个块中声明一个函数。块中的函数声明仅在ES2015中标准化,好吧,它们在严格模式下有意义,但在松散模式下它们……很奇怪。

严格模式下,您的代码可能会按预期运行,可能无法正常运行。bob可以访问b...,并且在该块之外bob不能b访问,除非您进行某些操作以将其暴露在该块之外。

这是一个示例,您可以用来在Safari和iOS Safari上对其进行测试(我只有后者可用)。这个版本给出了一个错误:

<script>
window.onerror = e => {
    document.body.insertAdjacentText("beforeend", String(e));
};
</script>
<script>
{
    let bob = 5;
    function b() {
        document.body.insertAdjacentText("beforeend", bob++);
    }

    b();
}
</script>

错误是:

ReferenceError: Can't find variable: bob

此版本适用:

<script>
window.onerror = e => {
    document.body.insertAdjacentText("beforeend", String(e));
};
</script>
<script>
"use strict"; // <============================
{
    let bob = 5;
    function b() {
        document.body.insertAdjacentText("beforeend", bob++);
    }

    b();
}
</script>

我还在最新版本的JavaScriptCore(Apple的JavaScript引擎)v265499中复制了该行为。我安装了¹并在本地运行(将console.log/更改insertAdjacentTextprint,这在大多数原始引擎可执行文件中都可用),并且在松散模式(而非严格模式)下出现相同的错误。


如果您想b在块外使用,最好这样做:

"use strict";
const b = (() => {
    let bob = 5;
    return function b() {
        console.log(bob++);
    };
})();
b();

这是一个很多笨重,但是......或者,用let

"use strict";
let b;
{
    let bob = 5;
    b = function b() {
        print(bob++);
    };
}
b();

¹使用非常方便的jsvu实用程序

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Flutter/Dart API 调用引发错误(有时)

在文件顶部使用配置块会引发错误

为什么读取属性有时会在javascript中引发错误?

如果我没有在nil上执行代码,为什么Rails会引发错误

点安装会引发错误代码1

为什么这个 Python 代码会引发错误?

如果代码符号过期,IE会引发错误吗?

为什么在安装依赖项时Yarn会引发错误,而NPM却没有?

为什么在SpriteKit中检测到冲突有时无法正常工作并引发错误时转换SKSpriteNode

滚动带有隐藏列的 RadDataGrid 会引发错误

带有* ngIf的表单会引发错误消息

具有Unicode字符的字典键会引发错误

带有字典的Playsound设置会引发错误

segfaults时,CUDA设备代码不会引发错误

代码不正确时应引发错误

访问在try块内分配的var会引发错误:给定错误''的未知代码引用类型。检查您的用法,然后重试

JavaScript引发错误-循环中的代码不起作用

当我尝试查找每行具有最大值的列名时,为什么`idxmax`会引发错误?

从ResourceStream提取压缩文件会引发错误“无效的存储块长度”

带有Typescript的笑话在导入文件时引发错误

带有Node的LevelDB在创建时引发错误

末尾的行(尚未执行)如何影响代码的开头?为什么会引发错误的错误?

预期打字稿tsc会引发错误,但没有引发

Angular 通用安装会引发错误

尝试重置导航会引发错误

使 NSAttributedString 符合 Codable 会引发错误

对象解构会引发错误

在.then()内部调用函数会引发错误

parseFloat是否会引发错误?