簡體   English   中英

是否可以在函數中使用非全局變量?

[英]Is it possible to use non-global variables in function?

我真的很滿意這一點,並沒有找到一個真正解釋得很好的答案......

我知道如何從函數中訪問全局變量。

myGlobalVariable = [];
function myFunction() {
  myGlobalVariable.push("somedata");
}

現在,如果它不是全局的,我如何在范圍鏈上一步訪問變量?

myGlobalVariable = [];

function myFunction() {

  var notGlobalVariable = "somedata";

  var myOtherFunction = function() {
    myGlobalVariable.push(notGlobalVariable); // This is what I'd like to be able to do.
  }

}

我知道我可以做點什么

var notGlobalVariable = "somedata";

var myOtherFunction = function(arg) {
  myGlobalVariable.push(arg);
}

myOtherFunction(notGlobalVariable);

但是只有當notGlobalVariable的值可用時,調用該方式才有效。 我希望能夠全局調用該函數,並始終使用notGlobalVariable最初持有的值,而不必傳遞該值。

編輯
好吧,我有點跳過這一槍。 我雖然有一個很大的變量范圍問題,但顯然我的問題是在我的特定代碼中我使用變量名稱arguments代替notGlobalVariable ,並且我應該知道, arguments被遮蔽並且引用傳入的參數我將名稱更改為args並且工作正常。 抱歉!

JavaScript通過創建閉包自動完成。

  • 每個函數都創建自己的范圍。
  • 范圍是嵌套的,因為函數可以在函數中定義。
  • 每個新的嵌套作用域( “函數” )都可以看到在其創建的任何父作用域(即新函數)中定義的所有變量。 這稱為閉包。
  • 來自任何父作用域的每個變量都是“通過引用” - 子作用域( “函數” )總是看到它們的當前值。
  • 函數運行的時間點無關緊要,只是聲明它的時間點(參見第一個例子)。
  • 函數運行的范圍無關緊要,只定義函數的范圍(參見第二個示例)。

這里

var myGlobalVariable = [];

// define function => creates closure #1
function myFunction() {
  var notGlobalVariable = "somedata";

  // define function => creates closure #2
  var myOtherFunction = function() {
    myGlobalVariable.push(notGlobalVariable);
  }

  // execute function
  myOtherFunction();
}

myFunction();  // myGlobalVariable will be ["somedata"]

你創建了兩個范圍:

  1. myFunction可以看到myGlobalVariable
  2. 存儲在myOtherFunction的匿名函數可以看到myGlobalVariablenotGlobalVariable

現在假設一個小小的變化:

var myGlobalVariable = [];

// define function => creates closure #1
function myFunction(callback) {
  var notGlobalVariable = "somedata";

  // define function => creates closure #2
  var myOtherFunction = function() {
    myGlobalVariable.push(callback());
  }

  // execute function
  myOtherFunction();
}

// define function => creates closure #3
function foo() {
  var thisIsPrivate = "really";

  // define function => creates closure #4
  return function () {
    return thisIsPrivate;
  }
}

myFunction(foo());  // myGlobalVariable will be ["really"]

您會看到callback函數可以訪問thisIsPrivate因為它是在正確的范圍內定義的,即使它執行的范圍無法看到變量。

同樣, callback函數將無法看到notGlobalVariable ,即使該變量在執行回調的作用域中可見。

請注意,您始終必須對您定義的任何變量使用var 否則變量將是靜默全局的,這可能並且將導致難以修復程序中的錯誤。

是的,你可以 - 在javascript中一切皆有可能 - 這里是小提琴http://jsfiddle.net/AZ2Rv/

myGlobalVariable = [];

function myFunction() {

  var notGlobalVariable = "somedata";

  // The following assigns a function to a variable
  var myOtherFunction = function() {
    myGlobalVariable.push(notGlobalVariable);
  }

  // The following line was missing in the code in the question so the function
  // was never called and `notGlobalVariable` wasn't pushed into `myGlobalVariable`
  myOtherFunction();
}

// And just to test if it works as expected
myFunction();
alert(myGlobalVariable[0]);

OP的問題實際上是在他沒有發布的代碼中實現的,但是這個示例代碼回答了原始問題 - 閉包仍然按照預期在javascript中工作。

您可以訪問notGlobalVariable內的myOtherFunction 但是,您只是分配myOtherFunction並且從不調用它。 請注意,您必須在myFunction調用myOtherFunction

function myFunction() {

  var notGlobalVariable = "somedata";

  var myOtherFunction = function() {
    myGlobalVariable.push(notGlobalVariable); // This is what I'd like to be able to do.
  }
  //Invoke myOtherFunction()
  myOtherFunction()

}

暫無
暫無

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

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