簡體   English   中英

我可以在函數內定義一個javascript變量(不是全局變量),並且該變量在其作用域內是可見的嗎?

[英]Can I define a javascript variable (not global) inside a function and this variable be visible ouside his scope?

我需要在函數內定義一個變量,並且該變量必須在其原始作用域和上面的一個作用域中可見(與全局變量不同)。

有可能用JavaScript嗎?

例如。

function mainFunction () {

    function firstFunction() {
      var var1 = 10;
      secondFunction();
      console.log(var2); // must be 20 (must be undefined one scope above  firstFunction())
      console.log(var1); // must be 10 (of course)
    }

    function secondFunction() {
      var var2 = 20;
      console.log(var2); // must be 20 (of course)
      console.log(var1); // must be undefined
    }

    firstFunction();

    console.log(var2); // must be undefined
    console.log(var1); // must be undefined

}

使用ES6,您可以限制這些功能的作用域。 這給出了在特定塊中定義的“全局”變量,並使該范圍中定義的函數可以訪問它。

{
    let var1 = 10;
    function one() {
        //...
    }
    function two() {
        //...
    }
}

這使您可以對范圍進行簡單有效的控制,尤其是在起吊和功能方面。

編輯以進行編輯:除非將var2作為參數傳遞給函數,否則沒有某種上級作用域就無法將其范圍限定為2個函數。 同樣,如果mainFunction沒有作用域,則firstFunction無法訪問var2(再次,除非已設置參數)。

secondFunction()firstFunction()范圍之外,因此您的評論

// must be 20 (must be undefined outside firstFunction() scope)

意味着var2永遠無法被secondFunction()訪問

就像您在代碼中注釋了它一樣,它將起作用。 功能范圍不會傳播到全局范圍。

為什么不在頂部聲明變量?

var var1, var2;

一種可能是使用靜態變量,例如

function firstFunction() {
    firstFunction.var1 = 10;
}

// you can access firstFunction.var1 outside the firstFunction()

...但是,當然,這是一種花哨的方式。

在javascript中,可以使用閉包來訪問私有變量。 閉包是即使父函數已關閉,也可以訪問父作用域的函數。

function mainFunction () {

    function firstFunction() {
       var var1 = 10;
       var var2 = secondFunction();
       console.log(var2); // must be 20 
       console.log(var1); // must be 10 (of course)
    }

    function secondFunction() {
        var var2 = 20;
      console.log(var2); // must be 20 (of course)
      return var2;
    }

    firstFunction();

   // console.log(var2); // must be undefined
   // console.log(var1); // must be undefined

}

mainFunction();

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures

采用

window.var1
window.var2

代替

暫無
暫無

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

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