我试图通过阅读原始规范来围绕ES6中新的标准化块级功能.我的肤浅理解是:
然而,由于这些语义的一部分被指定为"可选的"并且仅对于Web浏览器是必需的(附件B),因此这进一步复杂化.所以我想填写下表:
| Visible outside of block? | Hoisted? Up to which point? | "TDZ"? |
------------------------------------------------------------------------------------------------------------------------
| Non-strict mode, no "web extensions" | | | |
| Strict mode, no "web extensions" | | | |
| Non strict mode, with "web extensions | | | |
| Strict mode, with "web extensions" | | | |
另外我不清楚在这种情况下"严格模式"是什么意思.这种区别似乎在附件B3.3中引入,作为函数声明的运行时执行的一些附加步骤的一部分:
1. If strict is false, then
...
Run Code Online (Sandbox Code Playgroud)
但是,据我所知,strict指[[Strict]]的是函数对象的内部插槽.这是否意味着:
// Non-strict …Run Code Online (Sandbox Code Playgroud) 我正试图在"孤立"的上下文中运行受信任的 JS代码.基本上想出了这个方法:
function limitedEval(src, context) {
return (function() {
with(this) {
return eval(src)
}
}).call(context)
}Run Code Online (Sandbox Code Playgroud)
这很好用,但是当脚本使用var关键字时,它存储在执行上下文中,而不是with语句中提供的上下文(我理解这是设计).例如,以下代码不起作用:
var ctx = {};
limitedEval('var foo = "hello"', ctx);
limitedEval('alert(foo)', ctx); // error: foo is undefinedRun Code Online (Sandbox Code Playgroud)
我希望能够多次调用limitedEval()并重用上下文.那可能吗?