又上課啦,控制語句裏還差一個switch...case,咱們今天講完它,而後要開始正式講方法啦。javascript
switch的行爲其實與if很接近,咱們看看它的語法:
css
switch(變量表達式){ html
case 值1: 前端
//do somethingjava
break; chrome
case 值2: 瀏覽器
//do something前端工程師
break; ide
default: 函數
//do something
break;
}
爲何說它和if很像呢?由於它徹底能夠轉化爲下面的形式:
if(變量表達式 == 值1)
//do something
elseif(變量表達式 == 值2)
//do something
else
//do something
相比之下,用switch...case在代碼可讀性上會比用if...else更好一些。
注意那個break很重要,若是少了break,代碼會一直向下執行直到找到break或出了switch的範圍時纔會中止。不過有時能夠利用一下這個特性:
switch(變量表達式){
case 值1:
case 值2:
//do something
break;
case 值3:
//do something
break;
}
表示值1與值2時執行相同的代碼。
OK,消化一下,下面要講方法啦。
其實以前已經不止一次接觸過方法了,在有些書上管它叫函數,指的都是function。系統有許多內置的方法,好比咱們已經接觸過的parseInt()、document.getElementById()等等,還有一類是自定義方法,就是寫程序的人本身定義的。前者數量不少,建議兔去查文檔,本教程不會一一講解,只在demo中隨用隨講。後者對咱們來講纔是最重要的。
一、方法的定義
一個方法,其形態通常是這樣的:
function 方法名(參數1, 參數2){
//do something
return 返回值;
}
關鍵字function表示後面的定義是一個方法而不是變量,方法名在當前文檔裏要惟一(暫時這麼認爲吧)。參數是輸入數據,不是必須的,關鍵字return用來向外返回結果,也不是必須的。
好比咱們要作一個加法:
function add(x, y){
return x + y;
}
二、方法的調用
好比咱們要調用一下上面寫的add()方法,這麼寫:
var sum = add(100, 200);
三、方法的指針
方法名後面不寫括號,就表示方法的指針。指針是個什麼概念呢?兔能夠先這麼理解:方法至關於一個儲物櫃,裏面有不少內容,方法的指針至關於儲物櫃的號碼,號碼很短,但經過號碼咱們就能拿到儲物櫃裏的全部東西。
方法有了指針,就能夠像變量那樣進行賦值了,看這段代碼:
function add(x, y){
return x + y;
}
var func = add;
window.alert(func(x, y));
咱們並無定義func()這個方法,只是把add()方法的指針賦給了它,至關於它裏面存的就是add()方法的索引了,調用它和調用add()是同樣的。
四、匿名方法
在定義方法的時候,有時咱們也能夠不提供方法名,這就叫「匿名方法」,好比第一節課的時候用到window.setInterval(),提供給它的第一個參數就是個匿名方法:
window.setInterval(function(){ ... }, 100);
在function後面沒有寫方法名,直接就上括號了。由於這裏寫不寫方法名無所謂,這是個「一次性」的方法,只在這裏用,不會在別處用方法名來調用它。
結合上面講的方法指針,兔若是見了這樣的用法不要驚奇:
var func = function(x, y){
return x + y;
};
alert(func(100, 200));
其實還能更變態一點:
var sum = (function(x, y){ return x + y; })(100 ,200); alert(sum);
今天的內容有點多,雖然都沒有深刻下去,但也夠兔子理解一下子了。來玩小遊戲吧,以前看兔小白對動畫比較感興趣,今天上個動畫的小遊戲,用上下左右鍵能夠控制小人四處走動,不是簡單的移動喲,走路是有動畫的:
而後是代碼了:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>簡單的動畫</title>
<style>
#user{width:27px;height:41px;top:100px;left:200px;position:absolute;url(p_w_picpaths /user.png) 0 0}
</style>
<script type="text/javascript" language="javascript">
//定義幾個全局的變量
//direction記錄運動方向,0=中止、1=下、2=左、3=右、4=上,爲何這麼定義呢?這樣會上圖片的行相匹配,後面好處理
//img_x和img_y分別記錄圖片在div背景上的橫向和縱向偏移
var direction = 0, img_x = 0, img_y = 0;
//老面孔啦,不過這回它換了個時髦的名字,不叫get啦,改叫$了,沒錯,這也是合法的方法名
function $(id){
return document.getElementById(id);
}
//初始化
function init(){
//爲document對象定義事件處理函數,注意是不加括號的寫法
document.onkeydown = keydownHandler;
document.onkeyup = keyupHandler;
//設定定時器,第一個用來播放動畫,第二個用來移動小人
//注意也是用的指針的方式
window.setInterval(play, 100);
window.setInterval(move, 25);
}
//播放動畫的方法
function play(){
var user = $("user");
if(direction == 0){
//若是是中止,就把背景圖片的x偏移置爲最左邊一列,y偏移不動
img_x = 0;
}
else{
//咱們的小人大小是27*41
//把img_x減掉27,表示向左移動27像素,這樣就移到第二張圖了。固然啦,要注意一行只有4張圖,超出了還要回到0
if((img_x -= 27) <= -108)
img_x = 0;
//y偏移與運動方向相關,把direction減掉1,再乘41,就是對應行的圖片了
img_y = -41 * (direction - 1);
}
//這裏涉及到了一個瀏覽器差別的問題,backgroundPositionX表示背景圖的x偏移,對應css是background-position-x
//但只有ie和chrome支持它,firefox不支持,firefox只支持backgroundPosition
//因此要判斷一下是否支持,支持才用這種方法設置,不然要換方法
//對前端工程師來講,最討厭的就是瀏覽器差別了,不少庫好比後面要講到的jQuery,都在努力經過封裝透明化這些差別
if(user.style.backgroundPositionX){
$("user").style.backgroundPositionX = img_x + "px";
$("user").style.backgroundPositionY = img_y + "px";
}
else{
$("user").style.backgroundPosition = img_x + "px " + img_y + "px";
}
}
//移動小人的方法
function move(){
var user = $("user");
//這裏用到今天學的swtich...case了
switch(direction){
case 1: //向下
user.style.top = (user.offsetTop + 2) + "px"; break;
case 2: //向左
user.style.left = (user.offsetLeft - 2) + "px"; break;
case 3: //向右
user.style.left = (user.offsetLeft + 2) + "px"; break;
case 4: //向上
user.style.top = (user.offsetTop - 2) + "px"; break;
}
}
//鍵按下時的處理方法
function keydownHandler(evt){
evt = evt || event;
//瞧,又看到今天學的switch了
switch(evt.keyCode){
case 37:
direction = 2; break;
case 38:
direction = 4; break;
case 39:
direction = 3; break;
case 40:
direction = 1; break;
}
}
//鍵擡起時的處理方法
function keyupHandler(){
//鍵擡起來了,表示中止移動了,設置direction=0
direction = 0;
}
</script>
<body onload="init()">
<!-- 這個就是咱們的主角啦 -->
<div id="user"></div>
</body>
</html>
認真讀代碼了沒?今天這個有點長,內容也比較多,有不懂的歡迎提問。
今天的做業是:
一、基礎題:如今的小人有時會走出邊界消失,能不能不讓它出去?或者從左邊走出去就又從右邊進來?