了解范围

时间:2016-01-18 14:43:42

标签: javascript scope closures lexical-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();

问题:在aFunc内调用bFunc,为什么'x is not defined'内有aFunc?这不是a.aFunc可以访问b.bFunc范围的简单闭包吗?

2 个答案:

答案 0 :(得分:2)

  

这不是一个简单的闭包,a.aFunc可以访问b.bFunc范围吗?

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

在您的情况下,当调用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中的变量中,因为闭包发生在函数定义期间。

答案 1 :(得分:2)

不,每个功能都有自己的范围。函数调用不与它共享它的范围。如果要通过作用域共享变量,则必须将它们放在共享作用域中,如下所示:

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();