簡體   English   中英

函數可以訪問在其自己的父函數中定義的變量嗎?

[英]Can functions access variables defined in its own parent function?

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

第一個示例失敗而第二個“工作”之所以與范圍和閉包有關。 您可以將函數的“大括號”視為圍繞其范圍(或影響范圍)的包圍。

第一個示例失敗,因為myBigFunction()的范圍無法訪問subFunction1()的變量。 myBigFunction()也沒有包裝subFunction1()來提供閉包。 在此處查看封包

但是, add()getScore()函數的范圍內聲明。 getScore() '包裝' add() -提供一個閉包,以便add()可以訪問getScore()范圍內的變量。

在第一個例子中

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范圍和閉包概念。

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

(希望這可以幫助!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM