我认为我理解了范围,但在考虑我遇到的特定代码问题时,我对以下内容感到困惑:
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
范围的简单闭包吗?
答案 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();