Javascript 在函数中定义为同级的函数是否可以访问其同级局部变量?

Javascript 在函数中定义为同级的函数是否可以访问其同级局部变量?,javascript,scope,Javascript,Scope,我最近接受了一次技术面试,其中一个问题涉及范围问题 var test = { constructor : function() { var x=""; test[sibling] = function() { console.log(x); } } }; test.constructor(); test.sibling(); 当函数运行时,它会测试匿名声明的函数的依赖关系吗?当test.sibling()初始化时,它会重新初始化test.con

我最近接受了一次技术面试,其中一个问题涉及范围问题

var test = {
 constructor : function() {
    var x="";
    test[sibling] = function() {
        console.log(x);
    }
  }  
};
test.constructor();
test.sibling();

当函数运行时,它会测试匿名声明的函数的依赖关系吗?当test.sibling()初始化时,它会重新初始化test.constructor()吗?如果没有,有没有办法在不初始化的情况下,让函数测试嵌套匿名函数的依赖关系?

该代码甚至不会运行。当test.constructor()时;调用时,测试[同级]=。。。遇到时,JS引擎将尝试解析同级变量的计算结果,但是没有在任何地方定义同级,并引发错误

但是,对于您关于如何解决变量的特定问题。只要您理解词汇范围,它就很容易理解。简而言之,将函数视为“气泡”。函数可以嵌套在其他函数中,这会在其他气泡中创建气泡。函数始终可以访问自己的变量及其父气泡的变量,但不能访问兄弟气泡


每当一个函数嵌套在另一个函数中时,就会形成一个闭包。子函数围绕父变量“关闭”。真正的诀窍是当子气泡(函数)比其父函数持续时间更长时会发生什么。通常,函数的变量在函数完成时被垃圾收集,但如果在父函数执行过程中,子函数被定义并以某种方式从父函数返回(通过返回语句或通过赋值作为对另一个对象的回调等),子函数在将来的某个时间点将需要这些父函数变量,这意味着当父函数完成时,不会对父函数的变量进行垃圾收集。这就是闭包的本质。

看一看闭包:一旦你找到了它,一切都会就绪。请检查:
同级
甚至在调用
构造函数之前都不会用函数定义。因此,初始化
constructor
不是
sibling
,而是相反。谢谢@RobertoStelling和Adam!还需要是
test['sibling']=function()
test.sibling=fun..
。变量
同级
未定义