2015-12-16 33 views
0

我試圖做一個函數,試圖訪問列表中的第一個項目來創建一個konami代碼網站。列表已定義,然後定義函數以編輯列表。這是代碼列表範圍的問題javascript

<html><body> 
<script> 
var keys = [38,38,40,40,37,39,37,39,66,65]; 
function keyhandler (e) { 
    e = e || event; 
    console.log(e.keyCode); 
    var key = keys[0]; 
    if (key == e.keyCode) { 
     console.log("correct key"); 
     if (keys.length == 1){ 
      console.log("konami"); 
     } else { 
      var keys = keys[1,keys.length]; 
     } 
    } 
    else { 
     var keys = [38,38,40,40,37,39,37,39,66,65]; 
    } 
} 
document.onkeydown = keyhandler; 
</script> 
</body></html> 

當我觸發一個按鍵的功能,我得到這個錯誤: 遺漏的類型錯誤:無法讀取屬性「0」的未定義的錯誤是由VAR鍵引起=鍵[0]線

+2

'變種鍵=鍵取代[1,keys.length]; '不正確的JavaScript,你打算做什麼? – juvian

+0

它看起來像試圖從數組中獲取一系列值。也許切片方法是在這裏? –

+2

@juvian這是一個_valid_ JavaScript語句。這裏有一個_logical_問題。 – undefined

回答

1
var keys = keys[1,keys.length]; 

你已經創建了一個新的(局部範圍)你的函數裏面keys變量,它是屏蔽包含你正在試圖讀取該陣列的一個。請記住:var的陳述已懸掛。

對這兩個變量使用不同的名稱(或者如果它們是假定是相同變量,則從內部變量中刪除var語句)。


注:在JavaScript中,[1,keys.length]只是一個comma operator它不是一個slice

+0

代碼行需要從列表中刪除第一個項目但是,此代碼不運行,因爲它停在定義鍵 – AlexanderRD

+0

@AlexanderRD - 是的,出於我描述的原因。 – Quentin

1

您正在初始化函數內的另一個名爲keys的變量(var keys = keys[1, keys.length])。這會影響外部變量。刪除var關鍵字以訪問正確的變量。

此外,我相信你想從列表中刪除第一個元素。爲此,請使用shift

keys.shift(); 

這將直接修改數組,所以你不必結果分配到任何東西。

+0

謝謝你回答key.shift,但我如何設置密鑰的第一個項目,而不會導致一個未捕獲的類型錯誤我在var key = keys [0] – AlexanderRD

+0

@AlexanderRD絆倒就像我說的,刪除'var'之前' var keys'。 –

0

正如昆汀所說,你的功能正在升高。 這裏的其他海報也說過了,你正在定義一個新的局部變量在你的函數中。

讓我展示與提升發生的功能時的Javascript解釋代碼:

var keys = [38,38,40,40,37,39,37,39,66,65]; 
function keyhandler (e) { 
    // Javascript defines all the local variables at top. 
    // This is what hoisting is 
    var key; 
    var keys; 
    e = e || event; 
    console.log(e.keyCode); 
    // at this point, local variable keys isn't initialized, 
    // that's why you are getting the undefined error. 
    key = keys[0]; 
    if (key == e.keyCode) { 
     console.log("correct key"); 
     if (keys.length == 1){ 
      console.log("konami"); 
     } else { 
      // you are referencing a local variable here 
      keys = keys[1,keys.length]; 
     } 
    } 
    else { 
     // you are referencing a local variable here 
     keys = [38,38,40,40,37,39,37,39,66,65]; 
    } 
} 
document.onkeydown = keyhandler; 

由於其他海報提及,只是從鍵刪除了var可以解決您的問題,如果這就是預期,但我認爲了解這種情況下Javascript在技術上做了什麼很重要。

0

的問題是

var key = keys[0]; 

並不像在註釋中提到一個JavaScript表達它需要與

var key = keys.slice(0,2);