javascript 新手, 最近在看蕭大直播編程, 第一集就有不明白的地方, 在蕭大重構(gòu)的時(shí)候, 在 GuaGame 里面對(duì) event, setInterval 進(jìn)行了一個(gè)注冊(cè)事件, 我不是很懂這個(gè)注冊(cè)事件的原理是怎樣的, 望有看過直播的人能解答一下:
沒重構(gòu)之前的代碼大概是這樣的:
window.addEventListener('keyup', function() {
var k = event.key
if (k == 'a') {
leftDown = false
}
else if (k == 'd') {
rightDown = false
}
})
setInterval(function() {
// update x
if (leftDown) {
x -= speed
}
else if (rightDown) {
x += speed
}
// draw
context.clearRect(0, 0, canvas.width, canvas.height)
context.drawImage(img, x, y)
}, 1000/30)
我的理解是:
對(duì) KeyboardEvent 進(jìn)行監(jiān)聽, 如果是按下對(duì)應(yīng)的鍵(比如'a')就執(zhí)行 setInterval函數(shù)來移動(dòng) paddle
重構(gòu)以后這部分代碼變成了這樣:
var g = {
actions: {},
keydowns: {},
}
window.addEventListener('keydown', function(event){
g.keydowns[event.key] = true
})
window.addEventListener('keyup', function(event){
g.keydowns[event.key] = false
})
// 注冊(cè)事件
g.registerAction = function(key, callback) {
g.actions[key] = callback
}
// timer
setInterval(function() {
// events
var actions = Object.keys(g.actions)
for (var i = 0; i < actions.length; i++) {
var key = actions[i]
if (g.keydowns[key]) {
// 如果案件被按下, 調(diào)用注冊(cè)的 actions
g.actions[key]()
}
}
// update
g.update()
context.clearRect(0, 0, g.canvas.width, g.canvas.height)
// draw
g.draw()
}, 1000/30)
不是很理解這個(gè) actions 和 keydowns兩個(gè)對(duì)象到底是儲(chǔ)存了什么, 這段注冊(cè)事件到底是怎么一個(gè)原理.
若有人能解答, 不勝感激, 謝謝
我沒有看過直播,但是這個(gè)例子我想應(yīng)該是這樣理解:
最初的代碼里面,很多硬編碼,主要時(shí)那兩段if-else,如果要加入其他按鍵,比如c鍵、d鍵,會(huì)很麻煩
重構(gòu)之后g.keydowns保存所有預(yù)定義的按鍵的狀態(tài),g.actions里面保存按鍵上綁定的函數(shù),然后在下面的setInterval中接收按鍵的狀態(tài),然后調(diào)用綁定的函數(shù),這樣一來,以后要加入新的按鍵和函數(shù)就會(huì)很容易,只要對(duì)外開放一個(gè)注冊(cè)接口,然后在外面注冊(cè)就行了。
這是一個(gè)比較經(jīng)典的重構(gòu)的例子,martin fowler的書里面講過
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。