Понимание Области Применения


Я думал, что понял область применения, однако, думая о конкретной проблеме кода, которую я имел, Я смущен следующим:

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 3

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, так как замыкание происходит во время определения функции.

Нет, каждая функция имеет свою собственную область видимости. Вызов функции не разделяет с ней ее область действия. Если вы хотите поделиться переменными через область, вы должны поместить их в общую область следующим образом:

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