簡體   English   中英

在不使用全局變量的情況下從其他函數訪問變量

[英]Accessing variables from other functions without using global variables

我從各種各樣的地方聽說全局變量本質上是討厭和邪惡的,但是當做一些非面向對象的Javascript時,我看不出如何避免它們。 假設我有一個使用隨機數和東西使用復雜算法生成數字的函數,但我需要在其他函數中繼續使用該特定數字,這是一個回調或其他函數,因此不能成為同一函數的一部分。

如果最初生成的數字是局部變量,那么就無法訪問它。 如果函數是對象方法,我可以將數字作為屬性,但它們不是,並且看起來有點過於復雜,以改變整個程序結構來執行此操作。 全局變量真的如此糟糕嗎?

我覺得這里最好的辦法可能是定義一個全局范圍的變量,並且有傾倒的變量:

var MyApp = {}; // Globally scoped object

function foo(){
    MyApp.color = 'green';
}

function bar(){
    alert(MyApp.color); // Alerts 'green'
} 

做上述事情的人不應該對你大喊大叫。

要使函數A中計算的變量在函數B中可見,您有三個選擇:

  • 使它成為一個全球的,
  • 使它成為一個對象屬性,或
  • 從A調用B時將其作為參數傳遞

如果你的程序相當小,那么全局變量就不那么糟了。 否則我會考慮使用第三種方法:

function A()
{
    var rand_num = calculate_random_number();
    B(rand_num);
}

function B(r)
{
    use_rand_num(r);
}

考慮使用命名空間:

(function() {
    var local_var = 'foo';
    global_var = 'bar'; // this.global_var and window.global_var also work

    function local_function() {}
    global_function = function() {};
})();

local_functionglobal_function都可以訪問所有本地和全局變量。

編輯 :另一種常見模式:

var ns = (function() {
    // local stuff
    function foo() {}
    function bar() {}
    function baz() {} // this one stays invisible

    // stuff visible in namespace object
    return {
        foo : foo,
        bar : bar
    };
})();

現在可以通過命名空間對象(例如ns.foo訪問return ed屬性,同時仍保留對本地定義的訪問權限。

您正在尋找的是技術上稱為currying。

function getMyCallback(randomValue)
{
    return function(otherParam)
    {
        return randomValue * otherParam //or whatever it is you are doing.
    }

}

var myCallback = getMyCallBack(getRand())

alert(myCallBack(1));
alert(myCallBack(2));

上面的內容並不完全是一個curried函數,但它實現了維護現有值的結果,而無需向全局命名空間添加變量或者需要一些其他對象存儲庫。

如果另一個函數需要使用變量,則將其作為參數傳遞給函數。

全球變量本身也不是惡劣的。 只要它們使用得當,它們就沒有問題。

另一種方法是我從Douglas Crockford論壇帖子( http://bytes.com/topic/javascript/answers/512361-array-objects )中選擇的方法。 這里是...

Douglas Crockford寫道:

06年7月15日

“如果你想通過id檢索對象,那么你應該使用一個對象,而不是一個數組。由於函數也是對象,你可以將成員存儲在函數本身中。”

function objFacility(id, name, adr, city, state, zip) {

    return objFacility[id] = {

        id: id,
        name: name,
        adr: adr,
        city: city,
        state: state,
        zip: zip

    }
}

objFacility('wlevine', 'Levine', '23 Skid Row', 'Springfield', 'Il', 10010);

“可以用”獲得對象“

objFacility.wlevine

現在可以從任何其他函數中訪問對象屬性。

我發現這對原始問題非常有幫助:

返回你想在functionOne中使用的值,然后在functionTwo中調用functionOne,然后將結果放入一個新的var中,並在functionTwo中引用這個新的var。 這應該使您能夠在functionTwo中使用functionOne中聲明的var。

function functionOne() {
  var variableThree = 3;
  return variableThree;
}

function functionTwo() {
  var variableOne = 1;
  var var3 = functionOne();

  var result = var3 - variableOne;

  console.log(variableOne);
  console.log(var3);
  console.log('functional result: ' + result);
}

functionTwo();

如果您有可能重用此代碼,那么我可能會努力使用面向對象的視角。 使用全局命名空間可能很危險 - 由於變量名稱被重用,您將面臨很難發現錯誤的風險。 通常我首先使用面向對象的方法,而不僅僅是簡單的回調,這樣我就不必重寫了。 任何時候你在javascript中有一組相關的函數,我認為,它是面向對象方法的候選者。

你可以使用自定義的jQuery事件完全控制javascript函數的執行(並在它們之間傳遞變量)....有人告訴我這不可能在這些論壇上,但我有一些工作正是這樣做(甚至使用ajax電話)。

這是答案(重要提示:這不是經過檢查的答案,而是我的回答“Emile”):

如何獲取跨多個函數返回的變量 - Javascript / jQuery

我不知道你的問題的具體細節,但如果函數需要值,那么它可以是通過調用傳遞的參數。

Globals被認為是錯誤的,因為全局狀態和多個修飾符可能會導致難以遵循的代碼和奇怪的錯誤。 對許多擺弄東西的演員來說,可能會造成混亂。

暫無
暫無

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

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