2014-04-28 49 views
1

我想創建一個簡單的對象字面值與其中的方法,在這種情況下,它是一個畫布上的移動塊。我寫使用教程下面的代碼塊在http://www.html5rocks.com我對JS對象字面值使用方法缺少了什麼?

var block = { 
    color: "#000000", 
    x: 0, 
    y: 0, 
    width: 30, 
    height: 30, 
    draw: function() { 
     ctx.fillStyle = this.color; 
     ctx.fillRect(this.x, this.y, this.width, this.height); 
    } 
}; 

function update() { 
    block.x = block.x + 30; 
    block.y = block.y + 30; 
} 

function draw() { 
    var x = document.getElementById("space"); 
    var ctx = x.getContext("2d"); 

    ctx.clearRect(0, 0, 900, 600); 

    block.draw(); 
} 

出於某種原因,它不會像這樣工作,而它會如果我現在寫的代碼在draw()函數繪製方法。我可能錯過了一些東西,但是什麼?

+8

如何都應該接受,如果你認爲「CTX」變量代碼不要將它作爲參數傳遞? – Pointy

+2

當JavaScript不起作用時,請務必查看您的控制檯,它可能包含有用的錯誤。 @Pointy並不總是在附近告訴你什麼是錯的。 –

回答

3

block及其成員,從未聽說過ctx,這是draw()函數的本地信息。

要麼做出全球性的,或將其傳遞到block.draw

var block = { 
    // ... 

    draw: function(ctx) { 
    // ... 
    } 
}; 

// ... 

block.draw(ctx); 
+0

'塊'是一個對象,甚至不知道「範圍」的概念。就像你說的那樣,只有函數可以「聽到變量」。 – Bergi

+0

我最不喜歡通俗地解釋事情。我顯然是歷史上最糟糕的怪物。 –

1

ctx時聲明的方法是不知道。該方法創建一個閉包,並且對於ctx沒有任何價值。請記住,範圍並不是完全動態的(關於引用),因爲範圍是在函數定義時定義的,而不是函數的用法。

如何解決它:通過ctx作爲參數傳遞給方法,或作爲可分配的屬性(修改方法來引用this.ctx

相關問題