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