函數使用關鍵字 function 來定義,定義的方式有兩種——函數定義運算式和函式宣告語句。下面範例程式碼中的兩種定義寫法:
//函數定義運算式var square = function(x){ return x * x;};//函式宣告語句function square(x){ return x * x;};
儘管函式宣告語句和函數定義運算式包含相同的函數名,但二者仍然不同。和通過 var 聲明變數一樣,函數定義語句中的函數被顯式地“提前”到了指令碼或函數的頂部。因此它們在整個指令碼和函數內都是可見的。使用 var 的話,只有變數聲明提前了——變數的初始化代碼仍然在原來的位置。然而使用函式宣告語句的話,函數名稱和函數體均提前:指令碼中的所有函數和函數中的所有嵌套的函數都會在當前上下文中其他代碼之前聲明。也就是說,可以在聲明一個 javascript 函數之前調用它。
<!DOCTYPE HTML><html lang="en-US"><head> <meta charset="UTF-8"> <title>js-function</title></head><body> </body></html><script type="text/javascript">distance(0,0,3,4);//函式宣告語句————無論定義在哪裡,都會被“提前”到指令碼或函數的頂部。function distance(x1,y1,x2,y2){ var dx = x2 - x1; var dy = y2 - y1; alert(Math.sqrt(square(dx) + square(dy)));};//函數定義運算式————只有變數聲明提前了,而變數的初始化代碼仍然在原來的位置。需要注意js執行順序。var square = function(x){ return x * x;};</script>
上面的代碼,由於 square 是函數定義運算式並且定義在了最後,導致在執行 distance 函數的時候,square 的值是 undefined。
解決方案:
1、將函數定義運算式寫法改成函式宣告語句寫法。
2、將函數定義運算式寫在執行函數(distance(0,0,3,4);)之前。