了解范围
Understanding Scope
我以为我理解范围,但是,在考虑我遇到的一个特定代码问题时,我对以下内容感到困惑:
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();
问题:在bFunc
里面调用了aFunc
,为什么在aFunc
里面得到了'x is not defined'
?这不是一个 a.aFunc
可以访问 b.bFunc
作用域的简单闭包吗?
Isnt this a simple closure where a.aFunc can access b.bFunc scope?
没有。闭包是 属性 函数的一个 属性 ,它在其范围内包含所有变量, 在它们的定义期间,而不是在它们的调用期间。
在你的例子中,当 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();
我以为我理解范围,但是,在考虑我遇到的一个特定代码问题时,我对以下内容感到困惑:
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();
问题:在bFunc
里面调用了aFunc
,为什么在aFunc
里面得到了'x is not defined'
?这不是一个 a.aFunc
可以访问 b.bFunc
作用域的简单闭包吗?
Isnt this a simple closure where a.aFunc can access b.bFunc scope?
没有。闭包是 属性 函数的一个 属性 ,它在其范围内包含所有变量, 在它们的定义期间,而不是在它们的调用期间。
在你的例子中,当 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();