函式
函式(又稱為方法)用於對一大段為了達到某種目的的程式碼進行歸類,以使程式碼更具有條理:
//一段計算三角形面積的程式碼 var wide=window.prompt("請輸入三角形的底邊長度!",""); var high=window.prompt("請輸入三角形的高!",""); var area=wide*high/2; if (isNaN(area)) {//判斷使用者是否輸入的是數字 alert("三角形的面積為"+area); } else { alert("您的輸入有誤!"); }
如果我們需要在其它地方使用此功能,那麼最簡單的方法就是Ctrl+C然後Ctrl+V,使用函式可以節約一些程式碼
function calcAngleArea() { //使用function關鍵字宣告一個函式,接著是函式的名稱,函式名稱必須符合變數的命名規範 //花括號用來表示一段程式碼塊 var wide=window.prompt("請輸入三角形的底邊長度!",""); var high=window.prompt("請輸入三角形的高!",""); var area=wide*high/2; if (isNaN(area)) { alert("您的輸入有誤!"); } else { alert("三角形的面積為"+area); } }
但是寫了這樣了個計算三角形面積的函式之後,頁面開啟時並沒有任何東西會出現,那是因為函式必須使用 “函式名()”這樣的語句來呼叫執行,所以我們還需要再新增一句calcAngleArea();如果要多次進行這樣的計算,只需多次呼叫些函式即可!(事實上,看到這樣的格式,我們發現,像alert(),prompt(),isNaN()這些也是函式,它們是系統內建的函式!)
//在之前我們已經宣告瞭計算三角形面積的函式calcAngleArea calcAngleArea(); calcAngleArea(); calcAngleArea(); //將會進行三次這樣的計算
當然,我們可以對其進行一些改進,以使這個函式更好用
function calcAngleArea(wide,high) {//具有引數的函式,引數其實是一些變數,多個引數用“,”分隔 var area=wide*high/2; if (isNaN(area)) { alert("您的輸入有誤!"); } else { alert("三角形的面積為"+area); } }
這樣,函式就具有伸縮性了,我們不必強制使用者在prompt彈窗中輸入內容。我們先測試一下函式如何執行
calcAngleArea(12,8);//傳入引數12和8,在函式內部執行。接著我們就看到了輸出
同樣,有時候我們並不是相讓使用者輸入某些值,也並不想將某些值輸給使用者。但現在這個計算三角形面積的函式不管我們想如何處理結果,它都只是在彈窗中將結果顯示給使用者。這個時候就用到了函式返回值的功能:
//在函式內部可以使用return語句將值返回給呼叫函式的上下文 function calcAngleArea(wide,high) { var area=wide*high/2; if (isNaN(area) || !area) { return false; alert("注意,一個函式中的return執行之後,函式就停止執行了,所以你不會看到我!"); } else { return area; } } var a=calcAngleArea(23,8);//執行函式,函式的返回值將會賦給變數a if (a) { document.write(a);//當函式有返回值時,我們可以以想要的任何方式來輸出a,而不是預先定義好的alert }
這樣,這個函式的功能就是真正的無瑕眥的計算三角形面積的函式了(儘管看上去有些簡單),我們輸入寬和高,然後函式將其計算後將結果返回,如果只是像"calcAngleArea(23,8)"這樣呼叫函式的話,返回的結果將會丟失,所以我們用一個變數將結果儲存了下來。
函式所帶來的作用域問題
在函式內部宣告的變數(區域性變數),在函式外部並不能訪問
function demo() { var a="外面不能訪問我!"; } //alert(a);//出錯,沒有宣告變數a demo();//執行函式 alert(a);//仍然出錯
但在函式外部宣告的變數(全域性變數),在函式內部是可以訪問的
function demo() { //在一個指令碼中,使用function關鍵字宣告的具有名稱的函式在指令碼中出現的次序是任意的,並不存在先後之分 alert(globalVar); } //demo();//出錯,執行時變數globalVar還沒有宣告 var globalVar="Hello!"; demo();//輸出Hello!
內建物件Math與Date
Math物件為我們提供了很多用於數學計算的方法和一些常量
alert(Math.PI);//輸出π alert(Math.pow(10,3));//輸出10的3次方 alert(Math.abs(-12));//輸出-12的絕對值 var num=23.34; alert(Math.ceil(num));//返回大於等於num的最小整數 alert(Math.floor(num));//返回小於等於num的最大整數。 alert(Math.round(num));//返回與num最接近的整數(四捨五入)。 alert(Math.random());//返回介於 0 和 1 之間的偽隨機數。產生的偽隨機數介於 0 和 1 之間(含 0,不含 1) alert(Math.max(2,3,4));//返回多個數值引數中較大的那個 alert(Math.min(2,3,1));//返回多個數值引數中較小的那個 alert(Math.sqrt(2));//返回一個數的平方根 alert(Math.SQRT2);//返回2的平方根 alert(Math.SQRT1_2);//返回二分之一的平方根
Date物件像一個時光機
var d = new Date();//Date物件需要建立 //Date 物件能夠表示的日期範圍約等於 1970 年 1 月 1 日前後各 285,616 年。 alert(d);//直接輸出這個物件,將會得到一個表示時間的字串 //這個物件有一些方法,可以用來獲取時間的各個部分 alert(d.getYear());//獲取年,2000年以前返回年份後兩位,2000年之後的返回年份的完整表達方式 alert(d.getFullYear());//始終返回年份的4位數表達方式 alert(d.getMonth());//返回月份,注意,月份是從0開始計數的,所以1月時將返回0 alert(d.getDate());//返回今天幾號 alert(d.getDay());//返回今天星期幾,星期天是0,星期1是1.... alert(d.getHours());//返回小時 alert(d.getMinutes());//返回分鐘 alert(d.getSeconds());//返回秒 alert(d.getMilliSeconds());//返回毫秒 alert(d.getTime()); //返回一個整數值,這個整數代表了從1970年1月1日開始計算到Date物件中的時間之間的毫秒數 //日期的範圍大約是1970年1月1日午夜的前後各285616年,負數代表1970年之前的日期
我們不但能從中獲取時間值,還可以設定時間值
var d = new Date(); d.setFullYear(1990);//設定年份為1900 alert(d.getFullYear());//返回1900 alert(d.getTime());//輸出的值是負的,這驗證了上面所說的getTime()返回值
與那些getXXX方法對應的設定時間的函式僅僅是將get改成set
var d=new Date(); d.setFullYear(2004); d.setMonth(11);//設定月份為12月,注意月份是從0開始計數的 d.setDate(2); d.setHours(6); d.setMinutes(12); d.setSeconds(12); alert(d.getDay());//輸出2004年12月2日星期幾 //setXXX這樣的方法有個最大的好處就是如果我們設定了錯誤的值,指令碼並不會出錯,但日期會自動更正 d= new Date(); d.setYear(2003); d.setMonth(1);//月份從0開始計數 d.setDate(31);//2月從來不會有31號 alert(d);//輸出日期,發現會是3月3號
運用Date物件這個自動更正的好處,我們可以用它來判斷使用者輸入的日期是否是有效的
//讓使用者輸入生日 var year=window.prompt("請輸入出生年份!","")*1; var month=window.prompt("請輸入出生月份!","")*1; var date = window.prompt("請輸入出生日!","")*1; if (!year || !month || !date) {//NaN轉換成布林值將會是false alert("您的輸入有誤!"); } else { var timeMachine=new Date(); timeMachine.setFullYear(year); timeMachine.setMonth(month-1);//記住,月份是從0開始計數的 timeMachine.setDate(date); var trueYear = timeMachine.getFullYear(); var trueMonth = timeMachine.getMonth()+1;//記住,月份是從0開始計數的 var trueDate = timeMachine.getDate(); if (trueYear != year || trueMonth != month || trueDate != date) { alert("您撒謊!"); } else { alert("雖然這個時光機能知道輸入的日期是否有效,至於人是不是在那天生的,它是不能去看一看的!"); } }