Javascript JS-在外部函数之外声明嵌套函数 案例1:我理解为什么它在这种情况下有效: 案例2:但我不明白,如果单独在外部声明bar函数,为什么以下不起作用: 案例3:如果我向bar函数添加参数:

Javascript JS-在外部函数之外声明嵌套函数 案例1:我理解为什么它在这种情况下有效: 案例2:但我不明白,如果单独在外部声明bar函数,为什么以下不起作用: 案例3:如果我向bar函数添加参数:,javascript,function,lexical-scope,Javascript,Function,Lexical Scope,输出: "arg: undefined" "outer variable: " undefined 我的问题是关于案例2:为什么bar()没有到达foo()中定义的变量 编辑案例2: 从所有反馈中学习到,我在栏(arg,outer)中添加了参数,并且效果良好。非常感谢 function foo(arg) { var outer = " this is the outer variable"; bar(arg, out

输出:

"arg: undefined"
"outer variable: " undefined
我的问题是关于案例2:为什么
bar()
没有到达
foo()
中定义的变量

编辑案例2: 从所有反馈中学习到,我在
栏(arg,outer)
中添加了参数,并且效果良好。非常感谢

function foo(arg) {
    var outer = " this is the outer variable";

    bar(arg, outer);
}

function bar(arg, outer) {
    console.log("arg: " + arg);
    console.log("outer variable: ", outer);
}

console.log(foo("hello"));

它可以工作。

函数参数仅在声明函数内部可见

因此
bar
函数无法访问
foo的
参数

您应该将参数传递给foo函数

function foo(arg) {
  var outer = " this is the outer variable";

  bar(arg); //<-------------
}

function bar(arg, outer) {
  console.log("arg: " + arg);
  console.log("outer variable: ", outer);
}
函数foo(arg){
var outer=“这是外部变量”;

bar(arg);//函数参数仅在声明函数内部可见

因此
bar
函数无法访问
foo的
参数

您应该将参数传递给foo函数

function foo(arg) {
  var outer = " this is the outer variable";

  bar(arg); //<-------------
}

function bar(arg, outer) {
  console.log("arg: " + arg);
  console.log("outer variable: ", outer);
}
函数foo(arg){
var outer=“这是外部变量”;

bar(arg);//因为
bar
的词法范围是由它在代码中的位置定义的,而不是由它执行的链条定义的。让我引用维基百科中关于这个主题的内容:

范围界定的一个根本区别是什么是“程序的一部分” 在具有词法范围(也称为静态范围)的语言中, 名称解析取决于源代码中的位置和 词法上下文,由命名变量或 函数是定义的。相反,在具有动态范围的语言中 名称解析取决于使用名称时的程序状态 遇到由执行上下文或调用确定的 上下文

在实践中,对于词汇范围,变量的定义由 搜索其包含的块或函数,如果失败 搜索外部包含块等,而使用动态 搜索调用函数的作用域,然后搜索调用的函数 调用函数,依此类推,使调用堆栈向上扩展 当然,在这两个规则中,我们首先寻找一个 变数


换句话说,如果你在
foo
中声明
bar
,它的词法范围将包括
foo
的词法范围。

因为
bar
的词法范围是由它在代码中的位置定义的,而不是由执行它的链条定义的。让我引用维基百科关于这个主题:

范围界定的一个根本区别是什么是“程序的一部分” 在具有词法范围(也称为静态范围)的语言中, 名称解析取决于源代码中的位置和 词法上下文,由命名变量或 函数是定义的。相反,在具有动态范围的语言中 名称解析取决于使用名称时的程序状态 遇到由执行上下文或调用确定的 上下文

在实践中,对于词汇范围,变量的定义由 搜索其包含的块或函数,如果失败 搜索外部包含块等,而使用动态 搜索调用函数的作用域,然后搜索调用的函数 调用函数,依此类推,使调用堆栈向上扩展 当然,在这两个规则中,我们首先寻找一个 变数


换句话说,如果您在
foo
中声明
bar
,它的词法范围将包括
foo
的词法范围。

无论函数从何处调用,甚至是如何调用,它的词法范围都是仅由函数的声明位置定义的

function foo(arg) {
  var outer = " this is the outer variable";
  function bar() {
    console.log("arg: " + arg);
    console.log("outer variable: ", outer);
  }
  bar();
}

在这里,bar可以访问外部变量,因为它在其词法范围内,而不是在情况2中。

无论函数从何处调用,甚至调用方式如何,它的词法范围都是仅由函数声明的位置定义的

function foo(arg) {
  var outer = " this is the outer variable";
  function bar() {
    console.log("arg: " + arg);
    console.log("outer variable: ", outer);
  }
  bar();
}
在这里,bar可以访问外部变量,因为它在词法范围内,但不在案例2中

我的问题是关于案例2:为什么bar()没有到达 在foo()中定义的变量

外部
被声明为
变量
,这意味着它具有功能范围(在声明它的函数内部可以访问)

因此,在
foo
(在
bar
中)之外,除非在
bar
中或在其父范围内声明它(声明
bar
的函数),否则无法访问


来自评论

我假设嵌套函数可以访问内部定义的变量 外部功能

  • 混淆似乎源于这样一种想法,
    bar
    嵌套在
    foo
    -中,这是错误的

  • function foo(arg) {
      var outer = " this is the outer variable";
      function bar() {
        console.log("arg: " + arg);
        console.log("outer variable: ", outer);
      }
      bar();
    }
    
  • bar
    foo
    不是私有的,因为它不是在
    foo
    中声明的,所以它与
    foo
    在同一范围内声明

我的问题是关于案例2:为什么bar()没有到达 在foo()中定义的变量

外部
被声明为
变量
,这意味着它具有功能范围(在声明它的函数内部可以访问)

因此,在
foo
(在
bar
中)之外,除非在
bar
中或在其父范围内声明它(声明
bar
的函数),否则无法访问


来自评论

我假设嵌套函数可以访问内部定义的变量 外部功能

  • 孔夫西
    function foo(arg) {
      var outer = " this is the outer variable";
    
      bar();
    }
    
    function bar(arg,outer) {
      console.log("arg: " + arg);
      console.log("outer variable: ", outer);
    }
    
    console.log(foo("hello"));