【问题标题】:Can functions access variables defined in its own parent function?函数可以访问在它自己的父函数中定义的变量吗?
【发布时间】:2019-02-19 02:25:30
【问题描述】:

Mozilla 的开发人员资源显示了关于函数范围的两个相互矛盾的解释。

Here 表示即使“变量定义在与函数调用相同的范围内”,代码也会抛出错误,因为“它没有在函数定义内定义”。

示例)

function myBigFunction() {
  var myValue;

  subFunction1();
}

function subFunction1() {
  console.log(myValue);
} //this will show a reference error

但是,here 表示“在另一个函数中定义的函数也可以访问其父函数中定义的所有变量以及父函数可以访问的任何其他变量”。

示例)

function getScore() {
  var num1 = 2,
      num2 = 3;

  function add() {
    return name + ' scored ' + (num1 + num2);
  }

  return add();
} //this is ok

【问题讨论】:

  • 两者并不矛盾,实际上是互补的。变量范围就像这个函数
  • 两个例子的变量都是在父函数中声明的
  • 在第一个例子中没有父函数。父函数是封装函数的函数。在第一个示例中,定义了两个单独的函数。
  • subFunction1(); 只是在父函数内部调用,在父函数外部定义。定义的函数签名是 function subFunction1() {...
  • 那么可以说函数定义的声明位置很重要吗?

标签: javascript function variables scope


【解决方案1】:

在你的第一个例子中

function myBigFunction() {
  var myValue;

  subFunction1();
}

function subFunction1() {
  console.log(myValue);
} //this will show a reference error

这里 myValue 包含在函数 myBigFunction() 中,因此它具有块作用域。

块范围意味着该块中的任何代码(这里函数定义块)可以使用该变量,如果函数包含另一个函数(函数定义)和使用该变量的内部函数,那么它将在闭包中传递给内部函数。第二种情况与我在这里解释的完全相同。

function getScore() {
  var num1 = 2,
      num2 = 3;

  function add() {
    return name + ' scored ' + (num1 + num2);
  }

  return add();
} //this is ok

在上面的例子中 num1 和 num2 在函数 getScore() 中声明,它有内部函数 add() 因为使用 num1 和 num2 添加函数,它将作为闭包传递给 add() 函数,不会有任何访问这些变量时出错。

但在第一个示例中,变量是在范围之外访问的,并且作为在该函数之外访问的变量,它将无法访问,并且会引发引用错误。

我希望解释清楚你的理解。要彻底理解它,请通过 JavaScript 作用域和闭包概念。

【讨论】:

  • 感谢您的回答。我认为您要说的是块范围仅扩展到已在父函数中定义的内部函数,因为从技术上讲 subFunction1() 和 add() 都是“内部函数”。
【解决方案2】:

第一个示例失败而第二个“有效”的原因与范围和闭包有关。您可以将函数的“花括号”视为围绕其范围或影响范围的外壳。

第一个示例失败,因为myBigFunction() 的变量无法在subFunction1() 的范围内访问。 myBigFunction() 也不会包装 subFunction1(),这将提供一个闭包。 Check out closures here.

但是,add() 是在 getScore() 函数的范围内声明的。 getScore() 'wraps' add() - 提供一个闭包,以便add() 可以访问getScore() 范围内的变量。

【讨论】:

  • 这两个例子的唯一区别不就是调用函数“add()”吗?它们都显示了包裹在父函数中的内部函数。
  • 第一个示例没有显示任何“包装”。第一个示例 simple 在其范围内调用另一个函数。区别在于定义。由于subFunction1() 没有在myBigFunction() 中定义,它没有访问权限。
  • 当您说“包装”时,您的意思是在父函数中声明函数的定义吗?
  • 是的。这会创建一个闭包。
【解决方案3】:

使用this关键字获取父变量,即

var bar = function () {
  this.foo = "example";//the only catch is you have to have the this key word when defining the term.
  var subfunction = function () {
    this.foo = "This an example!";
  }
}

(希望对您有所帮助!)

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 2012-05-26
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 2020-08-03
    • 2023-04-05
    相关资源
    最近更新 更多