Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:函数及其作用域/词法环境是如何传递的?_Javascript_Function_Scope_Closures - Fatal编程技术网

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
在其外部。因此会抛出引用错误


有关更多信息,请参阅。

内部功能的范围是其自身的外部功能。不是从中调用它的函数。

内部函数的范围是它自己的外部函数。不是从中调用它的函数