我正在使用闭包,并且可以毫无问题地理解内部函数如何访问外部词法环境:
function outer() {
var bar = 0;
function inner() {
console.log(bar);
}
inner();
}
outer(); // prints '0'
但令我着迷的是:
function foo() {
return function inner() {
console.log(bar);
}
}
function outer() {
var bar = 0;
var fakeInner= foo(); // not the same as "var fakeInner= function () { console.log(bar); }"
fakeInner();
}
outer(); // ReferenceError: bar is not defined
在这里,我尝试通过将“内部函数”分配给从外部函数返回的函数表达式来“定义”“fakeInner”。
我曾经认为 JavaScript 使用其代码的“副本”创建了 fakeInner
,类似于: var fakeInner= function () { console.log(bar); }
,然后就可以访问 bar
,但事实并非如此——当调用 fakeInner
时,JavaScript 会追溯到它的 定义。我的理解正确吗?也就是说,函数对象(声明或表达式)仅仅是对其定义点的引用,传递它们不会改变它们的词法环境(因此内部函数必须使用显式语法在内部定义)?
最佳答案
是的,函数只能访问它们自己的词法环境——从它们定义的地方。 JavaScript 没有dynamic scope其中函数可以对其调用范围进行任何类型的访问。
这是通过将作用域附加到函数对象来实现的,它是闭包的一部分。
关于JavaScript:函数及其作用域/词法环境如何传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35244201/