1. 程式人生 > >JavaScript引用型別Function例項詳解

JavaScript引用型別Function例項詳解

Function型別

函式是物件,函式名是指標:每個函式都是Function型別的例項。由於函式是物件,因此函式名是一個指向函式物件的指標,不會與某個函式繫結,一個函式可能會有多個名字。

function getSum(a, b) {
  return a + b;
}//前端全棧學習交流圈“866109386
alert(getSum(2, 3));//5
var copy = getSum;
alert(copy(2, 3));//5
getSum = null;
alert(copy(2, 3));//5

定義函式的方式有三種:函式宣告、函式表示式、Function建構函式。

Function建構函式接收任意數量的引數,前面的引數枚舉了函式的引數,最後一個引數是函式體。一般不推薦使用Function建構函式定義函式。

var getSum = new Function("a", "b", "return a + b";

JavaScript沒有函式過載的概念,若聲明瞭兩個同名函式,則後面的函式會覆蓋前面的函式。

由於函式名本身是變數,因此函式也可以作為值來使用,不僅可以傳遞一個函式作為引數,還可以將函式作為返回值。

function callFunction(func, arguments) {
  return func(arguments);
}//前端全棧學習交流圈:866109386
function sayHello(name) {
  return "Hello, " + name;
}
var result = callFunction(sayHello, "Alice");
alert(result);//Hello, Alice

①、函式宣告

function 函式名稱(引數|可選) { 函式體 }

例:

function func1(){// 宣告,程式的一部分
  function func() {// 宣告,函式體的一部分
    ...//函式體
  }
}

②、函式表示式

function 函式名稱|可選(引數|可選) { 函式體 }

例1:

var fun = function func() {};//表示式,賦值表示式的一部分

例2:

new function func(){};//表示式,new表示式

例3:

(function func(){});
//表示式,包含在分組操作符——括號()內,括號()內只能包含表示式

例4:

[function func() {}];//表示式,陣列初始化器內只能是表示式

例5:

1, function func() {};//表示式,逗號只能操作表示式

③、函式構造器

函式構造器建立的函式的[[Scope]]屬性僅包含全域性物件。

<script>
  var a = 1;
  func1();
  function func1() {
    var a = 2;
    var b = 3;
    var func2 = new Function("alert(a); alert(b);");
    func2();//1,b is not defined
  }
</script>

函式構造器建立的函式func2可以從全域性物件中取得變數a,但全域性物件中沒有b,因此報錯:b未定義。

函式宣告和函式表示式的區別

1)函式宣告在進入上下文階段建立,在程式碼執行階段就已經可用了,函式表示式則是在程式碼執行階段才建立,所以函式宣告可以提升,但函式表示式則不能。

函式宣告提升:

func();//報錯:func is not a function
var func = function (){
  alert("Function expression");
}

2)函式宣告影響變數物件VO,也就是儲存在上下文的VO中的變數物件,函式表示式不影響變數物件VO,不存在於變數物件中,這意味著既不可能通過名稱在函式宣告之前呼叫它,也不可能在宣告之後呼叫它。但是,函式表示式在遞迴呼叫中可以通過名稱呼叫自身。 例1:

alert(func); //報錯:func is not a function。定義之前不可用,因為它在程式碼執行階段建立
(function func() {});
alert(func); //報錯:func is not a function。定義之後也不可用,因為它不在變數物件

例2:

(function func(param) {
  if (param) {
    return;
  }
  func(true);//func可用,遞迴呼叫可以通過名稱呼叫自身
})();
func(); // func is not a function,外部不可用

3)函式宣告只能出現在程式或函式體內,不能出現在表示式或塊({ … })中,如if、while或for語句中。因為JavaScript無塊級作用域,只有函式和全域性作用域。 函式表示式出現在表示式的位置。

函式宣告:有的瀏覽器會返回if,而有的瀏覽器會返回else。

if (true) {
  function func() {
    alert('if');
  }
}
else {
  function func() {
    alert('else');
  }
}
func();

函式表示式:所有瀏覽器都返回if。

var func;
if (true) {
  func = function() {
    alert('if');
  };
}
else {
  func = function() {
    alert('else');
  };
}
func();