JavaScript引用類型Function實例詳解

Function類型前端

函數是對象,函數名是指針:每一個函數都是Function類型的實例。因爲函數是對象,所以函數名是一個指向函數對象的指針,不會與某個函數綁定,一個函數可能會有多個名字。express

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 函數名稱(參數|可選) { 函數體 }code

例:對象

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();
相關文章
相關標籤/搜索