我正在使用代码块来模拟静态函数变量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。
问题在于代码处于松散模式,并且您要在一个块中声明一个函数。块中的函数声明仅在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
/更改insertAdjacentText
为print
,这在大多数原始引擎可执行文件中都可用),并且在松散模式(而非严格模式)下出现相同的错误。
如果您想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] 删除。
我来说两句