3.2.1 從數(shù)學(xué)出發(fā)
讓我們回到第一章講述的小明的問(wèn)題, 從實(shí)際問(wèn)題下手編程,更容易學(xué)會(huì)編程 。小學(xué)時(shí)代的數(shù)學(xué)題最喜歡這樣子了——某商店里的糖一個(gè)5塊錢,小明買了3個(gè)糖,小明一共花了多少錢。在編程方面,也許我們還算是小學(xué)生。最直接的方法就是直接計(jì)算3x5=?
document.write(3*5);
document.write實(shí)際也我們可以理解為輸出,也就是往頁(yè)面里寫入3*5的結(jié)果,在有雙引號(hào)的情況下會(huì)輸出字符串。我們便會(huì)在瀏覽器上看到15,這便是一個(gè)好的開(kāi)始,也是一個(gè)糟糕的開(kāi)始。
3.3 設(shè)計(jì)和編程
對(duì)于實(shí)際問(wèn)題,如果我們只是止于所要得到的結(jié)果,很多年之后,我們就成為了code monkey。對(duì)這個(gè)問(wèn)題進(jìn)行再一次設(shè)計(jì),所謂的設(shè)計(jì)有些時(shí)候會(huì)把簡(jiǎn)單的問(wèn)題復(fù)雜化,有些時(shí)候會(huì)使以后的擴(kuò)展更加簡(jiǎn)單。這一天因?yàn)檫@家商店的糖價(jià)格太高了,于是店長(zhǎng)將價(jià)格降為了4塊錢。
document.write(3*4);
于是我們又得到了我們的結(jié)果,但是下次我們看到這些代碼的時(shí)候沒(méi)有分清楚哪個(gè)是糖的數(shù)量,哪個(gè)是價(jià)格,于是我們重新設(shè)計(jì)了程序
tang=4;
num=3;
document.write(tang*num);
這才能叫得上是程序設(shè)計(jì),或許你注意到了“;”這個(gè)符號(hào)的存在,我想說(shuō)的是這是另外一個(gè)標(biāo)準(zhǔn),我們不得不去遵守,也不得不去fuck。
3.3.1 函數(shù)
記得剛開(kāi)始學(xué)三角函數(shù)的時(shí)候,我們會(huì)寫
sin 30=0.5
而我們的函數(shù)也是類似于此,換句話說(shuō),因?yàn)楹芏喔阌?jì)算機(jī)的先驅(qū)都學(xué)好了數(shù)學(xué),都把數(shù)學(xué)世界的規(guī)律帶到了計(jì)算機(jī)世界,所以我們的函數(shù)也是類似于此,讓我們做一個(gè)簡(jiǎn)單的開(kāi)始。
function hello(){
return document.write("hello,world");
}
hello();
當(dāng)我第一次看到函數(shù)的時(shí)候,有些小激動(dòng)終于出現(xiàn)了。我們寫了一個(gè)叫hello的函數(shù),它返回了往頁(yè)面中寫入hello,world的方法,然后我們調(diào)用了hello這個(gè)函數(shù),于是頁(yè)面上有了hello,world。
function sin(degree){
return document.write(Math.sin(degree));
}
sin(30);
在這里degree就稱之為變量。 于是輸出了-0.9880316240928602,而不是0.5,因?yàn)檫@里用的是弧度制,而不是角度制。
sin(30)
的輸出結(jié)果有點(diǎn)類似于sin 30。寫括號(hào)的目的在于,括號(hào)是為了方便解析,這個(gè)在不同的語(yǔ)言中可能是不一樣的,比如在ruby中我們可以直接用類似于數(shù)學(xué)中的表達(dá):
2.0.0-p353 :004 > Math.sin 30
=> -0.9880316240928618
2.0.0-p353 :005 >
我們可以在函數(shù)中傳入多個(gè)變量,于是我們?cè)倩氐叫∶鞯膯?wèn)題,就會(huì)這樣去編寫代碼。
function calc(tang,num){
result=tang*num;
document.write(result);
}
calc(3,4);
但是從某種程度上來(lái)說(shuō),我們的calc做了計(jì)算的事又做了輸出的事,總的來(lái)說(shuō)設(shè)計(jì)上有些不好。
3.3.2 重新設(shè)計(jì)
我們將輸出的工作移到函數(shù)的外面,
function calc(tang,num){
return tang*num;
}
document.write(calc(3,4));
接著我們用一種更有意思的方法來(lái)寫這個(gè)問(wèn)題的解決方案
function calc(tang,num){
return tang*num;
}
function printResult(tang,num){
document.write(calc(tang,num));
}
printResult(3, 4)
看上去更專業(yè)了一點(diǎn)點(diǎn),如果我們只需要計(jì)算的時(shí)候我們只需要調(diào)用calc,如果我們需要輸出的時(shí)候我們就調(diào)用printResult的方法。
3.3.3 object和函數(shù)
我們還沒(méi)有說(shuō)清楚之前我們遇到過(guò)的document.write以及Math.sin的語(yǔ)法為什么看上去很奇怪,所以讓我們看看他們到底是什么,修改app.js為以下內(nèi)容
document.write(typeof document);
document.write(typeof Math);
typeof document會(huì)返回document的數(shù)據(jù)類型,就會(huì)發(fā)現(xiàn)輸出的結(jié)果是
object object
所以我們需要去弄清楚什么是object。對(duì)象的定義是
無(wú)序?qū)傩缘募?,其屬性可以包含基本值、?duì)象或者函數(shù)。
創(chuàng)建一個(gè)object,然后觀察這便是我們接下來(lái)要做的
store={};
store.tang=4;
store.num=3;
document.write(store.tang*store.num);