JavaScript: 块作用域是函数作用域的子集?望得到解答.

插图中来自红宝书第四版的一小段:(第26页)
image.png
image.png
(图中分别是中英的版本,我都有认真去看)

如图是正在看红宝书第四版的一小段,这里说:

块作用域是函数作用域的子集
Block scope is strictly a subset of function scope

这句话的从集合的角度来看,其实可以理解成:所有的块作用域都是函数作用域.

这句话是否有错误?
let无论是在函数作用域或块级作用域的外部都是无法访问的.而var在函数作用域外部无法访问,在块级作用域外部是可以访问的.

假设这句话是正确的,表明var在块级作用域外部也是无法访问的.这显然跟前面的矛盾了.

因此,我认为应该是作者的笔误了,应该调转过来才对:
函数作用域是块作用域的子集.

阅读 2.4k
2 个回答

没有问题。你对子集的理解上有偏差。

偶数是整数的子集,但偶数都能被2整除,整数集合并不符合这个特征。子集符合的特征,超集一定要符合吗?

人是动物的子集,但是人可以有比动物更具体更特有的功能,这个算不算矛盾?

块级作用域是函数作用域的子集,这里说的是,函数作用域的要求块级作用域都符合,但是块级作用域可以有自己特有的更严苛的要求。

关键点在于这里所谓的集合, 它的元素到底是什么。并不是说子集符合的特征,超集都要符合,而是说,子集里有的元素,超集都有。

对 let 来说,函数作用域也是一种块作用域;对 var 来说,根本就不存在块作用域。从这个意义上来说,你说的函数作用域是块作用域的子集,似乎没什么问题。

从另一个角度来说,块作用域一定存在于函数作用域的内部,因为比函数作用域更大的就是 global 了,所以从这个意义上来说,块作用域是函数作用域的子集就没什么问题。

区别就在于:是按概念的“包含”来理解,还是按作用域范围的“包含”来理解。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题