【问题标题】:Understanding Scope了解范围
【发布时间】:2016-04-23 18:47:30
【问题描述】:
我以为我理解范围,但是在考虑我遇到的特定代码问题时,我对以下内容感到困惑:
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 内部被调用,为什么我在aFunc 内部得到'x is not defined'?这不是a.aFunc 可以访问b.bFunc 作用域的简单闭包吗?
【问题讨论】:
标签:
javascript
scope
closures
lexical-scope
【解决方案1】:
这不是一个简单的闭包,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 中的变量,因为闭包发生在函数定义期间。
【解决方案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();