深刻淺出JavaScript:定義函數(函數聲明&函數表達式)

定義函數

方法一:函數聲明

函數聲明要素: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');
};
相關文章
相關標籤/搜索