首页 > 解决方案 > 函数可以访问在它自己的父函数中定义的变量吗?

问题描述

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

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

例子)

function myBigFunction() {
  var myValue;

  subFunction1();
}

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

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

例子)

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

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

  return add();
} //this is ok

标签: javascriptfunctionvariablesscope

解决方案


在你的第一个例子中

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 在 function 中声明getScore(),并且它具有内部函数,add()因为使用 num1 和 num2 添加函数它将作为闭包传递给add()函数,并且在访问这些变量时不会出现任何错误。

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

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


推荐阅读