JavaScript:函数及其作用域/词法环境是如何传递的?
我在玩闭包,并且理解内部函数如何访问外部词汇环境没有问题:JavaScript:函数及其作用域/词法环境是如何传递的?,javascript,function,scope,closures,Javascript,Function,Scope,Closures,我在玩闭包,并且理解内部函数如何访问外部词汇环境没有问题: function outer() { var bar = 0; function inner() { console.log(bar); } inner(); } outer(); // prints '0' 但让我吃惊的是: function foo() { return function inner() { console.log(bar); } } function outer()
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不允许函数对调用它的作用域进行任何类型的访问
这是通过将作用域附加到函数对象来实现的,它是闭包的一部分。是的,函数只能从定义它们的位置访问它们自己的词汇环境。JavaScript不允许函数对调用它的作用域进行任何类型的访问 这是通过将作用域附加到函数对象来实现的,它是闭包的一部分。在本例中
函数外部(){
var-bar=0;
函数内部(){
控制台日志(bar);
}
内();
}
外部();
bar
的范围是外部
功能,可用于其中定义的所有功能
函数foo(){
返回函数内部(){
控制台日志(bar);
}
}
函数外部(){
var-bar=0;
var fakeInner=foo();//与“var fakeInner=function(){console.log(bar);}”不同
fakeInner();
}
外部();
在本例中,bar
在outer
内部可访问,但foo
在其外部。因此会抛出引用错误
另请参阅以了解更多信息。在本例中
函数外部(){
var-bar=0;
函数内部(){
控制台日志(bar);
}
内();
}
外部();
bar
的范围是外部
功能,可用于其中定义的所有功能
函数foo(){
返回函数内部(){
控制台日志(bar);
}
}
函数外部(){
var-bar=0;
var fakeInner=foo();//与“var fakeInner=function(){console.log(bar);}”不同
fakeInner();
}
外部();
在本例中,bar
在outer
内部可访问,但foo
在其外部。因此会抛出引用错误
有关更多信息,请参阅。内部功能的范围是其自身的外部功能。不是从中调用它的函数。内部函数的范围是它自己的外部函数。不是从中调用它的函数