首頁  >  文章  >  web前端  >  javascript函數字面量和Function()建構子的區別實例詳解

javascript函數字面量和Function()建構子的區別實例詳解

伊谢尔伦
伊谢尔伦原創
2017-07-27 16:58:522343瀏覽

函數字面量和Function()建構函數的區別 
雖然函數字面量是匿名函數,但語法允許為其指定任一個函數名,當寫遞歸函數時可以呼叫它自己,使用Function( )構造函數則不行。 

var f = function fact(x) { 
if (x < = 1) return 1; 
else return x*fact(x-1);
};

Function()建構子允許執行時間Javascript程式碼動態的建立和編譯。在這個方式上它類似全域函數eval()。

Function()建構子每次執行時都會解析函數主體,並建立一個新的函數物件。所以當在一個循環或頻繁執行的函數中呼叫Function()建構函數的效率是非常低的。相反,函數字面量卻不是每次遇到都重新編譯的。 

用Function()建構函數建立函數時並不遵循典型的作用域,它一直把它當作是頂級函數來執行。

var y = "global"; 
function constructFunction() { 
var y = "local"; 
return new Function("return y"); // 无法获取局部变量} 
alert(constructFunction()()); // 输出 "global" 函数直接量:

只要是表達式語法,腳本宿主就認為function 是一個直接量函數,如果什麼都不加,光以function 開頭的話則認為是一個函數聲明,把function 寫入一個表達式內部,例如四則運算,宿主也會將其當作是一個直接量,如下: 

var a = 10 + function(){ 
return 5; 
}();
(function(){ 
alert(1); 
} ) ( ); 
( function(){ 
alert(2); 
} ( ) ); 
void function(){ 
alert(3); 
}() 
0, function(){ 
alert(4); 
}(); 
-function(){ 
alert(5); 
}(); 
+function(){ 
alert(6); 
}(); 
!function(){ 
alert(7); 
}(); 
~function(){ 
alert(8); 
}(); 
typeof function(){ 
alert(9); 
}();

js中定義函數的方式有多種,函數直接量就是其中一種。如var fun = function(){},這裡function如果不賦值給fun那麼它就是一個匿名函數。 

看看匿名函數的如何被呼叫。 

1、執行後得到回傳值的函數呼叫 

//方式一,调用函数,得到返回值。强制运算符使函数调用执行 
(function(x,y){ 
alert(x+y); 
return x+y; 
}(3,4)); 
//方式二,调用函数,得到返回值。强制函数直接量执行再返回一个引用,引用在去调用执行 
(function(x,y){ 
alert(x+y); 
return x+y; 
})(3,4);

2、執行後忽略回傳值 

//方式三,调用函数,忽略返回值 
void function(x) { 
x = x-1; 
alert(x); 
}(9);

嗯,最後看錯誤的呼叫方式 

//错误的调用方式 
function(x,y){ 
alert(x+y); 
return x+y; 
}(3,4);

以上是javascript函數字面量和Function()建構子的區別實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn