了解范围

Understanding Scope

我以为我理解范围,但是,在考虑我遇到的一个特定代码问题时,我对以下内容感到困惑:

var a = {
  aFunc: function() {
    console.log(x);
  }
};
var b = {
  bFunc: function() {
    var x = c.x;
    console.log(x);
    a.aFunc();
  }
};
var c = {
  x: 'x is in c'
};

b.bFunc();

问题:在bFunc里面调用了aFunc,为什么在aFunc里面得到了'x is not defined'?这不是一个 a.aFunc 可以访问 b.bFunc 作用域的简单闭包吗?

Isnt this a simple closure where a.aFunc can access b.bFunc scope?

没有。闭包是 属性 函数的一个 属性 ,它在其范围内包含所有变量, 在它们的定义期间,而不是在它们的调用期间。

在你的例子中,当 a.aFunc 被调用时,它不会将变量包含在 b.bFunc 中,因为它只是在那里被调用,而不是在那里定义。


让我们尝试通过这个例子来理解这一点

function Test1(func) {
  var a = 0;
  func();
}

function Test() {
  var a = 5;
  Test1(function() {
    console.log(a);
  });
}

Test();

将打印 5,因为当 func() 被执行时,实际的函数对象已经包含在 Test 中的变量上,因为闭包发生在函数定义期间。

不,每个函数都有自己的作用域。函数调用不与其共享范围。如果你想通过作用域共享变量,你必须像这样把它们放在共享作用域中:

var x = 'x from shared scope';
var a = {
  aFunc: function() {
    console.log('aFunc: ' + x);
  }
};
var b = {
  bFunc: function() {
    var x = 'x only in scope b';
    console.log('bFunc: '+ x);
    a.aFunc(); 
  }
};

b.bFunc();