函數字面量和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中文網其他相關文章!