萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> JS特殊函數(Function()構造函數、函數直接量)區別

JS特殊函數(Function()構造函數、函數直接量)區別

   函數定義

  函數是由這樣的方式進行聲明的:關鍵字 function、函數名、一組參數,以及置於括號中的待執行代碼。

  函數的構造語法有這三種:

  Js代碼

  代碼如下:

  1.function functionName(arg0, arg1, ... argN) { statements }//function語句

  2.var function_name = new Function(arg1, arg2, ..., argN, function_body);//Function()構造函數

  3.var func = function(arg0, arg1, ... argN) { statements };//函數直接量

  示例:

  Js代碼

  代碼如下:

  1.function f(x){return x*x};//function語句

  2.var f = new Function("x","return x*x;");//Function()構造函數

  3.var f = function(x){return x*x;};//函數直接量

  如果函數無明確的返回值,或調用了沒有參數的 return 語句,那麼它真正返回的值是 undefined。

  Function()構造函數

  函數實際上是功能完整的對象 。Function類可以表示開發者定義的任何函數。用Function類直接創建函數的語法如下:

  var function_name = new function(arg1, arg2, ..., argN, function_body)

  在上面的形式中,每個 arg 都是一個參數,最後一個參數是函數主體(要執行的代碼)。這些參數必須是字符串。

  var sayHi = new Function("sName", "sMessage", "alert('Hello ' + sName + sMessage);");

  sayHi("jzj,", "你好!");//Hello jzj,你好!

  函數名只是指向函數的變量,那麼可以把函數作為參數傳遞給另一個函數嗎?答案是可以的,請看:

  Js代碼

  復制代碼 代碼如下:

  function callAnotherFunc(fnFunction, vArgument) {

  fnFunction(vArgument);

  }

  var doAdd = new Function("iNum", "alert(iNum + 10)");

  callAnotherFunc(doAdd, 10); //輸出 "20"

  注意:盡管可以使用 Function 構造函數創建函數,但最好不要使用它,因為用它定義函數比用傳統方式要慢得多。不過,所有函數都應看作 Function 類的實例 。

  如果你定義的函數沒有參數,那麼可以只需給構造函數傳遞一個字符串(即函數的主體)即可。

  注意:傳遞給構造函數Function()的參數中沒有一個用於說明它要創建的函數名。用Function()構造函數創建的未命名函數有時被稱為“匿名函數”。

  Function()函數允許我們動態地建立和編譯一個函數,它不會將我們限制在function語句預編譯的函數體中。

  函數直接量

  函數直接量是一個表達式,它可以定義匿名函數。函數直接量的語法和function語句非常相似,只不過它被用作表達式,而不是用作語句,而且也無需指定函數名。語法:

  Js代碼

  代碼如下:

  var func = function(arg0, arg1, ... argN) { statements };//函數直接量

  雖然函數直接量創建的是未命名函數,但是它的語法也規定它可以指定函數名,這在編寫調用自身的遞歸函數時非常有用,例如:

  Js代碼

  代碼如下:

  var f = function fact(x) {

  if (x <= 1) {

  return 1;

  } else {

  return x * fact(x - 1);

  }

  };

  注:它並沒有真正創建一個名為fact()函數,只是允許函數體用這個名字來引用自身。JavaScript1.5之前的版本中沒有正確實現這種命名的函數直接量。

  •函數引用

  函數名並沒有什麼實質意義,它不過是用來保存函數的變量名字,可以將這個函數賦給其他變量,它仍然會以相同方式起作用:

  Js代碼

  代碼如下:

  function square(x){return x*x;}

  var a = square;

  var b = a(5);//b 為25

  這有點像C++中的函數指針了。

  Function()構造函數和函數直接量差別

  Function()構造函數和函數直接量之間的差別有一點就是:使用構造函數Function()創建的函數不使用詞法作用域,相反的,它們總是被頂級函數來編譯,如:

  Js代碼

  代碼如下:

  var y = "global";

  function constructFunction() {

  var y = "local";

  //Function()構造函數

  return new Function("return y;");//不使用局部作用域

  }

  function constFunction() {

  var y = "local";

  //函數直接量

  var f = function () {

  return y;//使用局部作用域

  };

  return f;

  }

  //顯示 global,因為Function()構造函數返回的函數並不使用局部作用域

  alert(constructFunction()());

  //顯示 lobal,因為函數直接量返回的函數並使用局部作用域

  alert(constFunction()());

copyright © 萬盛學電腦網 all rights reserved