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

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

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 };//函數直接量 

示例:spa

function f(x){return x*x};//function語句 
var f = new Function("x","return x*x;");//Function()構造函數 
var f = function(x){return x*x;};//函數直接量 

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

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,你好! 
函數名只是指向函數的變量,那麼能夠把函數做爲參數傳遞給另外一個函數嗎?答案是能夠的,請看: blog

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()構造函數和函數直接量差異 
Function()構造函數和函數直接量之間的差異有一點就是:使用構造函數Function()建立的函數不使用詞法做用域,相反的,它們老是被頂級函數來編譯,如: 開發

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