2012-05-04 52 views
12

我想容納一個變量的函數依賴於用戶交互 這個變量將改變狀態保持可變活在JavaScript函數

function plan_state(current){ 
    if (current != ''){ 
    state = current; 
    } 
    else { 
    return state; 
    } 
} 

當文檔加載我打電話plan_state(「我」);

當某些事情發生,我可以調用plan_state(「愛」)

的問題,我運行的功能,並要檢查的當前狀態..

alert(plan_state()); 

我得到了一個未定義回來,並在至少應該是'我',因爲我設置這個onload。

我在做什麼錯?

+2

你在哪裏申報國家? – Loktar

+0

是通過將它設置爲'我'在onload函數中聲明的? –

回答

33

功能是無狀態的,因爲狀態變量聲明的函數內部,因此只存在壽命的函數調用。一個簡單的解決方案是在函數之外全局聲明變量。這是badbadbadbad

更好的方法是使用module pattern。如果你對JavaScript開發很認真,這是學習的基本模式。它使狀態由內部(私有變量)的裝置,並公開了一些用於改變或獲取的狀態(如面向對象編程)

var stateModule = (function() { 
     var state; // Private Variable 

     var pub = {};// public object - returned at end of module 

     pub.changeState = function (newstate) { 
      state = newstate; 
     }; 

     pub.getState = function() { 
      return state; 
     } 

     return pub; // expose externally 
    }()); 

方法或函數,從而stateModule.changeState("newstate");設置狀態

var theState = stateModule.getState();得到國家

+0

這是偉大的。我認爲這更多的是我正在尋找的東西,即使我沒有完全理解它..即使......我接受它作爲答案,因爲我避免了全局變量問題。謝謝。 –

+0

作品!並在實現它並玩它之後,我有點理解它..不得不將ChangeState更改爲changeState ..或者反之亦然。 –

+0

很高興幫助。使用該模式,您將很快成爲JavaScript忍者!我修復了函數調用大小寫錯誤thx來指出它。 – reach4thelasers

1

我相信你的變量的範圍太「低」;通過在函數中定義變量,無論是作爲參數還是顯式地作爲var,它都只能在函數內訪問。爲了實現你所追求的目標,你可以在函數範圍之外實現該變量,在更全局的evel中(並非真正推薦)。

但是,在重新閱讀您的問題之後,它會略微錯失領先地位。不管current是否不想返回state?我想你可能是以後像這樣:

var state; 
function plan_state(current) 
{ 
    if (current != '' && current != state) 
    { 
     state = current; 
    } 
    return state; 
} 

替代對象結構:

function StateManager(state) 
{ 
    this.state = state; 

    this.getState = function(current) 
    { 
     if (current != '' && current != this.state) 
     { 
      this.state = current; 
     } 
     return this.state; 
    } 
} 

// usage 
var myStateManager = new StateManager("initial state here"); 
var theState = myStateManager.getState("some other state"); 
+0

我想通過在函數中容納變量來避免全局變量 –

+1

通過在函數中聲明一個變量,它不是全局變量,這是正確的。但是,該變量的使用壽命僅在使用該功能時纔有效。當函數存在時,變量「不再存在」。你可能想考慮一個對象:) – Richard

+0

謝謝理查德 –