JavaScript 函數(shù)定義
定義函數(shù)
在JavaScript中,定義函數(shù)的方式如下:
function abs(x) {
? ?if (x >= 0) { ? ? ? ?return x;
? ?} else { ? ? ? ?return -x;
? ?}
}
上述abs()函數(shù)的定義如下:
function指出這是一個函數(shù)定義;abs是函數(shù)的名稱;(x)括號內(nèi)列出函數(shù)的參數(shù),多個參數(shù)以,分隔;{ ... }之間的代碼是函數(shù)體,可以包含若干語句,甚至可以沒有任何語句。
請注意,函數(shù)體內(nèi)部的語句在執(zhí)行時,一旦執(zhí)行到return時,函數(shù)就執(zhí)行完畢,并將結果返回。因此,函數(shù)內(nèi)部通過條件判斷和循環(huán)可以實現(xiàn)非常復雜的邏輯。
如果沒有return語句,函數(shù)執(zhí)行完畢后也會返回結果,只是結果為undefined。
由于JavaScript的函數(shù)也是一個對象,上述定義的abs()函數(shù)實際上是一個函數(shù)對象,而函數(shù)名abs可以視為指向該函數(shù)的變量。
因此,第二種定義函數(shù)的方式如下:
var abs = function (x) {
? ?if (x >= 0) { ? ? ? ?return x;
? ?} else { ? ? ? ?return -x;
? ?}
};
在這種方式下,function (x) { ... }是一個匿名函數(shù),它沒有函數(shù)名。但是,這個匿名函數(shù)賦值給了變量abs,所以,通過變量abs就可以調(diào)用該函數(shù)。
上述兩種定義完全等價,注意第二種方式按照完整語法需要在函數(shù)體末尾加一個;,表示賦值語句結束。
函數(shù)是 JavaScript 語言的核心之一,其基本語法如下:
function functionName(arg0, arg1, ...) {
? ?statements
}
語法解讀
使用 function 關鍵字定義一個函數(shù)
function 關鍵字空格之后緊跟函數(shù)名
函數(shù)名字后面是一對小括弧,arg0, arg1 表示函數(shù)的參數(shù),參數(shù)之間以 , 號分隔,參數(shù)個數(shù)可以為 0-25 個(0即表示無參數(shù))。在沒有參數(shù)時,() 括號不可省略,超過25個的參數(shù),將被JavaScript忽略
{} 是函數(shù)體,里面是該函數(shù)要實現(xiàn)的功能語句
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> <script type="text/javascript"> function hello(name){ document.write((name + ",你好!")); } </script> </head> <body> <input type="button" onclick="hello('小明')" value="確定"/> </body> </html>
函數(shù)表達式
JavaScript 函數(shù)可以通過一個表達式定義。
函數(shù)表達式可以存儲在變量中:
var x = function (a, b) {return a * b};
在函數(shù)表達式存儲在變量后,變量也可作為一個函數(shù)使用:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> </head> <body> <p id="demo"></p> <script> var x = function (a, b) {return a * b}; document.getElementById("demo").innerHTML = x(6, 9); </script> </body> </html>
函數(shù)提升(Hoisting)
在之前的教程中我們已經(jīng)了解了 "hoisting(提升)"。
提升(Hoisting)是 JavaScript 默認將當前作用域提升到前面去的的行為。
提升(Hoisting)應用在變量的聲明與函數(shù)的聲明。
因此,函數(shù)可以在聲明之前調(diào)用:
myFunction(5);
function myFunction(y) {
??? return y * y;
}
使用表達式定義函數(shù)時無法提升。
arguments
JavaScript還有一個免費贈送的關鍵字arguments,它只在函數(shù)內(nèi)部起作用,并且永遠指向當前函數(shù)的調(diào)用者傳入的所有參數(shù)。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> <script type="text/javascript"> function foo(x) { alert(x); // 10 for (var i=0; i<arguments.length; i++) { alert(arguments[i]); // 10, 20, 30 } } foo(10, 20, 30); </script> </head> <body> </body> </html>
函數(shù)是對象
在 JavaScript 中使用?typeof?操作符判斷函數(shù)類型將返回 "function" 。
但是JavaScript 函數(shù)描述為一個對象更加準確。
JavaScript 函數(shù)有?屬性?和?方法。
arguments.length 屬性返回函數(shù)調(diào)用過程接收到的參數(shù)個數(shù):
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文網(wǎng)(php.cn)</title> </head> <body> <p id="demo"></p> <script> function myFunction(a, b) { return arguments.length; } document.getElementById("demo").innerHTML = myFunction(4,7,3); </script> </body> </html>