函数中作为兄弟定义的函数是否可以访问其兄弟局部变量?

时间:2016-01-30 22:52:48

标签: javascript scope

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

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

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

1 个答案:

答案 0 :(得分:0)

该代码甚至不会运行。当test.constructor();被调用,遇到test [sibling] = ...,JS引擎将尝试解析兄弟变量求值的内容,但兄弟姐妹没有在任何地方定义并且抛出错误。

但是,关于如何解决变量的具体问题。只要您了解词汇范围,就可以很容易理解。简而言之,将功能视为“泡沫”。函数可以嵌套在其他函数中,这会在其他函数内部产生气泡。函数总是可以访问自己的变量及其父气泡的变量,但不能访问兄弟气泡。

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