函数嵌套中变量/参数/函数的可见性(作用域)问题求解
作用域测试题解析
测试题内容
测试你对变量可见性的理解。
测试代码
var outside = 'outside'; function a() { var aVar = 'a'; function aInner1() { var aInner1Var = 'aInner1Var'; function aInner1Inner() { var aInner1InnerVar = 'aInner1InnerVar'; } } function aInner2(aInner2Param) { var aInner2Var = aInner2Param; } } function b(bParam) { console.log(bParam); }
选择题(可多选)
- a对b可见
- b和bParam对a可见
- aInner1InnerVar仅对aInner1Inner和aInner1可见
- aInner1InnerVar对aInner1Inner可见
- aVar对aInner2可见
- aInner1Var对aInner2可见
- aInner2Param对aInner1可见
我的现有思路
- 局部函数可以访问父函数的内容,但不确定是否仅能访问函数名还是也能访问参数、变量等;
- 所有函数都能访问全局变量。
我尝试的伪代码
function one() { // one can see oneA, oneB, oneAB, two function oneA() { // oneA can see one, oneB function oneB() { // oneB can see one, oneA, oneB } } function oneAB() { // oneAB can see one, two } } function two() { // two can see one }
我的判断尝试
- a对b可见 // 全局作用域函数 → YES
- b和bParam对a可见 // 函数名a/b可见,不确定参数 → ?
- aInner1InnerVar仅对aInner1Inner和aInner1可见 // 块内变量对自身及外部函数可见 → ?
- aInner1InnerVar对aInner1Inner可见 // 块内变量对自身函数可见 → ?
- aVar对aInner2可见 // 函数能否访问另一个函数内的变量 → NO
- aInner1Var对aInner2可见 // 函数能否访问同一父函数下其他函数内的变量 → NO
- aInner2Param对aInner1可见 → NO
正确选项解析
- 1. 正确:
a和b都属于全局作用域,全局作用域内的所有标识符互相可见,因此b能访问a。 - 2. 错误:
b属于全局作用域,a可以看到b,但bParam是b的局部参数,仅在b的作用域内有效,a无法访问。 - 3. 错误:
aInner1InnerVar是aInner1Inner的局部变量,只有自身函数作用域能访问,aInner1作为外部函数也无法读取它。 - 4. 正确:局部变量在自身所属的函数作用域内必然可见,这是作用域的基础规则。
- 5. 正确:
aInner2是a的嵌套函数,嵌套函数可以访问父级函数作用域中的变量,aVar属于a的作用域,因此aInner2能访问它。 - 6. 错误:
aInner1Var是aInner1的局部变量,aInner1和aInner2是同级内部函数,作用域相互独立,无法访问对方的局部变量。 - 7. 错误:
aInner2Param是aInner2的局部参数,aInner1与aInner2同级,无法跨作用域访问对方的局部内容。
内容的提问来源于stack exchange,提问作者Timothy
相关产品推荐
相关产品推荐

