2012-05-04 6 views
12

Tôi muốn đến nhà một biến trong một hàm Biến này sẽ thay đổi trạng thái tùy thuộc vào tương tác người dùnggiữ biến sống trong một hàm javascript

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

khi tải doc tôi gọi plan_state ('tôi');

khi mọi thứ xảy ra nhất định tôi có thể gọi plan_state ('yêu')

vấn đề, tôi chạy một chức năng và muốn kiểm tra trạng thái hiện tại ..

alert(plan_state()); 

tôi nhận được xác định lại và tại ít nhất là nên là 'tôi' khi tôi thiết lập tình trạng này.

tôi đang làm gì sai?

+2

nơi bạn khai báo trạng thái? – Loktar

+0

là nó được khai báo trong hàm onload bằng cách đặt nó thành 'me'? –

Trả lời

33

Chức năng này không Stateful vì biến trạng thái được khai báo bên trong hàm và do đó chỉ tồn tại cho đời của cuộc gọi hàm. Một giải pháp dễ dàng là khai báo biến trên toàn cầu, bên ngoài hàm. Đây là badbadbadbad.

Cách tiếp cận tốt hơn là sử dụng module pattern. Đây là một mẫu thiết yếu để tìm hiểu xem bạn có nghiêm túc về phát triển javascript hay không. Nó cho phép nhà nước bằng phương pháp (biến tư nhân) nội bộ và đưa ra một số phương pháp hoặc các chức năng cho việc thay đổi hoặc nhận nhà nước (như lập trình hướng đối tượng)

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 
    }()); 

nên stateModule.changeState("newstate"); đặt trạng thái

var theState = stateModule.getState(); được tiểu bang

+0

điều này thật tuyệt. Tôi nghĩ rằng đây là nhiều hơn những gì tôi đang tìm kiếm và mặc dù tôi không hoàn toàn hiểu nó .. YET ... tôi chấp nhận nó như là câu trả lời như tôi đã tránh được vấn đề biến toàn cầu. Cảm ơn. –

+0

hoạt động !! và sau khi thực hiện nó và chơi với nó, tôi hiểu nó .. đã phải thay đổi ChangeState thành changeState bằng cách .. hoặc ngược lại. –

+0

Vui vì nó đã giúp.Sử dụng mẫu đó bạn sẽ là một ninja JavaScript trong thời gian không! Tôi đã sửa lỗi trường hợp gọi hàm thx để chỉ ra nó. – reach4thelasers

1

Tôi tin rằng phạm vi biến của bạn quá "thấp"; bằng cách xác định biến trong hàm, hoặc là tham số hoặc rõ ràng là var, nó chỉ có thể truy cập trong hàm. Để đạt được những gì bạn đang sau, bạn có thể thực hiện các biến bên ngoài phạm vi chức năng, tại một evel toàn cầu hơn (không được giới thiệu thực sự).

Tuy nhiên, sau khi đọc lại câu hỏi của bạn, nó hơi thiếu hàng đầu. Bạn có muốn trả lại state bất kể số current không? Tôi nghĩ rằng bạn có thể là sau khi một cái gì đó giống như vậy:

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

cấu trúc đối tượng khác:

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

tôi nghĩ bằng cách đặt biến số trong một hàm, đó là cách tránh các hình cầu –

+1

Bằng cách khai báo một biến trong một hàm không phải là toàn cục, điều đó đúng. Tuy nhiên tuổi thọ của biến đó chỉ hoạt động trong khi chức năng đang được sử dụng. Khi hàm tồn tại, biến "không còn tồn tại". Bạn có thể muốn xem xét một đối tượng :) – Richard

+0

Cảm ơn bạn Richard –