Понимание Области Применения
Я думал, что понял область применения, однако, думая о конкретной проблеме кода, которую я имел, Я смущен следующим:
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 ответа:
Разве это не простое замыкание, где 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();