栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JavaScript ES6中块级功能的确切语义是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaScript ES6中块级功能的确切语义是什么?

据我所知,

strict
是指
[[Strict]]
功能对象的内部插槽。

不,是的。它确实是指函数或脚本的严格性,其中包含函数声明的块出现在其中。不严格于要(或不要)声明的功能。

“ Web扩展”仅适用于草率的(非严格)代码,并且仅在函数语句的外观为“合理”的情况下(例如,其名称与形式参数不冲突或在词法上不匹配)声明的变量。

注意,没有网络兼容性语义的严格代码和草率代码之间没有区别。在纯ES6中,块中的函数声明只有一种行为。

所以我们基本上有

      |      web-compat    pure-----------------+---------------------------------------------strict mode ES6  |  block hoisting block hoistingsloppy mode ES6  |  it's complicated ¹        block hoistingstrict mode ES5  |  undefined behavior ²      SyntaxErrorsloppy mode ES5  |  undefined behavior ³      SyntaxError

1:请参见下文。要求警告。
2:通常

SyntaxError
抛出a。3:ES5.1§12中的注释谈到“实现之间的重大和不可调和的变化”(例如这些)。建议警告。

那么,具有Web兼容性的ES6实现如何在具有传统语义的草率模式函数中的块中的函数声明中起作用?
首先, 纯语义仍然适用 。即,函数声明被提升到词法块的顶部。但是,还有一个

var
声明悬挂在封闭函数的顶部。
当评估函数声明时(在块中,就像是一条语句一样被满足),函数对象将 分配 给该函数作用域变量。

这可以通过代码更好地解释:

function enclosing(…) {    …    {         …         function compat(…) { … }         …    }    …}

与…相同

function enclosing(…) {    var compat₀ = undefined; // function-scoped    …    {         let compat₁ = function compat(…) { … }; // block-scoped         …         compat₀ = compat₁;         …    }    …}

是的,这有点令人困惑,因为它们具有两个具有相同名称的不同绑定(用下标0和1表示)。现在,我可以简洁地回答您的问题:

Visible outside of block?

是的,就像

var
。但是,还有第二个绑定仅在块内部可见。

Hoisted?

是的-两次。

Up to which point?

函数(无论如何都使用初始化

undefined
)和块(都通过函数对象初始化)。

“ TDZ”?

不是在引用上抛出的按词法声明的变量(

let
/
const
/
class
)的时间盲区上,不是。但是,在执行主体时遇到函数声明之前,函数作用域变量是
undefined
(尤其是在块之前),并且如果尝试调用它,也会获得异常。


仅供参考:在ES6中,仅针对函数作用域中的块指定了上述行为。从ES7开始,这同样适用于

eval
全局范围内的块。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/418712.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号