2013-01-16 34 views
1

如下所示,我做了一個簡單的高分數組,保存到本地存儲並添加到用戶提示。範圍或功能提升問題?我不確定

作爲一個獨立的文件,它本身很好。或者至少它似乎是。

但是,當我嘗試將它集成到我的大型應用程序中時,我似乎遇到了範圍問題與我的全局變量allScores。數組的長度保持爲0.我檢查是否有任何變量重複,而我沒有。

我一直在嘗試閱讀關於函數提升和範圍。我不確定的是爲什麼下面的代碼作爲一個獨立的文件工作,但是當我將它集成到我的大型應用程序時,我遇到了範圍問題。

我應該如何做到這一點?由於我是JavaScript新手,我的最佳實踐很可能是關閉的。感謝您的指導。謝謝。

var allScores = []; 

function saveScore() { 

if (allScores.length === 0) { 
    allScores[0]= prompt('enter score', ''); 
    localStorage ['allScores'] = JSON.stringify(allScores); 
} 

else if (allScores.length < 3) { 
    var storedScores = JSON.parse(localStorage ['allScores']); 
    storedScores = allScores; 
    var injectScore = prompt('enter score', ''); 
    allScores.push(injectScore); 
    allScores.sort(function(a, b) {return b-a}); 
    localStorage ['allScores'] = JSON.stringify(allScores); 
} 

else { 
    var storedScores = JSON.parse(localStorage ['allScores']); 
    storedScores = allScores; 
    var injectScore = prompt('enter score', ''); 
    allScores.pop(); 
    allScores.push(injectScore); 
    allScores.sort(function(a, b) {return b-a}); 
    localStorage ['allScores'] = JSON.stringify(allScores); 
} 
document.getElementById('readScores').innerHTML = allScores; 
}** 
+0

你的代碼還有改進的空間,但我沒有看到任何可能導致你描述的東西。首先要檢查的是,如果您的大型應用程序中的任何其他代碼與「allScores」數組混淆了,因爲它是全局的。順便說一句,你真的需要它成爲全球? – bfavaretto

+0

有關您的環境的更多信息將有所幫助,例如正在使用哪個瀏覽器或解釋器,以及這些腳本如何連接在一起? –

+0

@bfavaretto希望我的編碼能夠隨着我的技能加班而提高。好吧,我認爲它需要是全球性的,因爲我正在檢查長度,因爲我將分數保存到數組中。我想我會獲得前5名的成績。 –

回答

1

我重構了您的代碼,努力展示一些可能會幫助您和其他人的做法,因爲您提到了問題中的最佳做法。以下是重構中使用的概念列表。如你所見,用你的分數處理邏輯封裝在這個函數上下文中,幾乎沒有任何東西可以在不使用接口的情況下篡改內部。理論上,您的saveScore函數可能會被其他代碼取代,但IIFE的上下文內部只能對有權訪問的內容進行修改。雖然no constantsstandardized ECMAScript,這種模塊模式的方法提供了一個體面的解決方案與可預測的結果。

+0

非常感謝。我完全打算仔細檢查您列出的所有條款。 –

+0

如果您找到有用的答案,請隨時將其投票,如果答案可以幫助您解決問題,則可以通過選中複選標記來表示。歡迎來到StackOverflow。 –

+0

不能投票,因爲我太新,沒有代表。我嘗試了你的迴應。 –

0

無需訪問你的環境,你能做的最好的事情就是讓使用Firefox的開發者工具(或讓螢火蟲)把一個斷點在saveScore功能。您可以一行一行地檢查並檢查值,甚至可以在控制檯窗口(REPL)中評估當前範圍內的表達式。

https://developer.mozilla.org/en-US/docs/Tools/Debugger - 與Firefox

http://getfirebug.com/javascript - 與螢火蟲(一個Firefox插件)

如果你在做網絡的發展,這些都是無價的資源,因此投資一些時間投入到學習如何使用它們。 (他們會爲你節省更多的時間!)

1

你有沒有考慮JS關閉? 下面是一些片給你一個想法..

var scoreboard = (function() { 
    var _privateVar = "some value"; //this is never exposed globally 
    var _allScores = []; 

    return { 
     getAllScores: function() { //public 
      return _allScores; 
     }, 
     saveScore: function(value) { //public 
      _allScores.push(value); 
     } 
    }; 
})(); 

alert(scoreboard.getAllScores().length); //0 
scoreboard.saveScore(1); 
alert(scoreboard.getAllScores().length); //1 
alert(scoreboard._privateVar); //undefined 
alert(scoreboard._allScores); //undefined 

這樣,你的變量和函數不會暴露到窗口對象,你不需要擔心重複或範圍。唯一必須唯一的變量是閉包函數的名稱(在本例中爲scoreboard)。