函數聲明要素:function關鍵字,functionName函數名,arg參數(可選)函數
語法性能
function functionName(arg){ //函數體 }
示例指針
function square(number) { return number * number; } var a = 2; square(a); //4
須要注意的地方:調試
當函數的參數是一個值(好比上面的例子),
若被調用函數改變了這個參數的值,這樣的改變不會影響到全局或調用的函數。code
但當函數的參數是一個對象(即一個非原始值,例如Array或用戶自定義的其它對象),
若函數改變了這個對象的屬性,這樣的改變對函數外部是可見的。對象
function myFunc(theObject) { theObject.make = "Toyota"; } var mycar = {make: "Honda", model: "Accord", year: 1998}, var x, y; x = mycar.make; // x 獲取的值爲 "Honda"【本來】 myFunc(mycar); y = mycar.make; // y 獲取的值爲 "Toyota"【如今】(make屬性的值在函數中被改變了)
函數表達式要素:var關鍵字,variableName變量名,表達式賦值等號,聲明變量後的分號,
functionName函數名(可選,沒有的話叫作匿名函數)io
語法console
var variableName = function functionName(arg){ //函數體 };
示例1(匿名函數)function
var square = function(number) { return number * number; }; var x = square(4); // x 獲得的值爲16
示例2(函數表達式也能夠提供函數名,而且能夠用於在函數內部使用來代指其自己,或者在調試器堆棧跟蹤中鑑別該函數)匿名函數
var factorial = function fac(n) {return n<2 ? 1 : n*fac(n-1)}; console.log(factorial(3)); var x = square(4); // x 獲得的值爲16
須要注意的地方:
使用Function構造函數也能夠定義函數,不過由於性能問題不推薦使用,在此僅做了解就好
語法
var variableName = new Function("arg0","arg1","函數體"); //函數是對象,函數名是指針,一個函數可能會有多個名字~~ //當一個對象的屬性是函數時,其稱之爲方法。
雖然均可以定義函數,但最大的區別在於:
解析器會率先讀取函數聲明,使其在執行任何代碼以前就能夠訪問(也就是 函數聲明提高);
而函數表達式則須要解析器執行到它所在的代碼行纔會被解釋執行。
sayHi();//能正常運行 彈Hi sayHi123();//報錯 Uncaught TypeError: sayHi123 is not a function(…) function sayHi(){ alert('Hi'); } var sayHi123 = function sayHi(){ alert('Hi123'); };