函数可以访问在其自己的父函数中定义的变量吗?

时间:2019-02-19 02:25:31

标签: javascript function variables scope

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

3 个答案:

答案 0 :(得分:1)

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

第一个示例失败,因为myBigFunction()的范围无法访问subFunction1()的变量。 myBigFunction()也没有包装subFunction1()来提供闭包。 Check out closures here

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

答案 1 :(得分: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函数会将其作为闭包传递给add()函数,并且访问这些变量不会有任何错误。

但是在第一个示例中,变量的访问范围超出范围,并且由于在该函数之外访问变量,因此将无法访问该变量,并且会引发引用错误。

我希望解释清楚您的理解。要全面了解它,请通过JavaScript范围和闭包概念。

答案 2 :(得分:0)

使用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!";
  }
}

(希望这会有所帮助!)