首頁  >  文章  >  web前端  >  JS特殊函式(Function()建構子、函式直接量)區別介紹_基礎知識

JS特殊函式(Function()建構子、函式直接量)區別介紹_基礎知識

WBOY
WBOY原創
2016-05-16 17:33:351155瀏覽
函數定義
函數是由這樣的方式進行宣告的:關鍵字 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","re​​turn 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)"); 注意:儘管可以使用Function 建構函數建立函數,但最好不要使用它,因為用它定義函數比用傳統方式要慢得多。不過,所有函數都應視為 Function 類別的實例 。
如果你定義的函式沒有參數,那麼可以只要給建構函式傳遞一個字串(即函式的主體)。
注意:傳遞給建構函式Function()的參數中沒有一個用來說明它要建立的函式名稱。用Function()建構函數所建立的未命名函數有時被稱為「匿名函數」。
Function()函數允許我們動態地建立和編譯一個函數,它不會將我們限制在function語句預先編譯的函數體中。
函數直接量

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



程式碼如下:


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

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


複製程式碼
程式碼如下: var f = function fact(x) { if (x 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 コード
Copy code code 以下のように:

var y = "グローバル";
functionconstructFunction() {
var y = "local";
//Function() コンストラクター
return new Function( "return y;");//ローカルスコープを使用しない
}
function constFunction() {
var y = "local";
//関数リテラル
var f = function () {
return y;//ローカル スコープを使用します
}
return f;
}
//Function() コンストラクターはローカル スコープを使用しないため、グローバルを表示します。 scope
alert(constructFunction()());
//関数は関数を直接返し、ローカル スコープ
alert(constFunction()()) を使用するため、グローバルを表示します。 >
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn