當前位置:才華齋>設計>網頁設計>

javascript中定義函式的區別

網頁設計 閱讀(1.02W)

1:呼叫關鍵字function來構造

javascript中定義函式的區別

如:

function distance(x1,x2,y1,y2) { var dx=x2-x1; var dy=y2-y1; return (dx*dx+dy*dy); }

2:使用Function()建構函式

如:

var f=new Function*"x","y","return x*y");

這行程式碼建立了一個新函式,該函式和你所熟悉的語法定義的函式基本上時等價的:

function f(x,y) { return x*y; }

Functino()建構函式可以接受任意多個字串引數。它的最後一個引數時函式的主體,其中可以包含任何JavaScript語句,語句之間用分號分隔。其他的引數都是用來說明函式要定義的形式引數名的字串。如果你定義的函式沒有引數,那麼可以只需給建構函式傳遞一個字串(即函式的主體)即可。

注意,傳遞給建構函式Function()的引數中沒有一個用於說明它要建立的函式名。用Function()建構函式建立的未命名函式有時被成為“匿名函式”。

你可能非常想知道Function()建構函式的用途是什麼。為什麼不能只用function語句來定義所有的函式呢?原因是Function()建構函式允許我們動態地建立和編譯一個函式,它不會將我們限制在function語句預編譯的函式體中。這樣做帶來的負面影響效應就是每次呼叫一個函式時,Function()建構函式都要對它進行編譯。因此,在迴圈體中或者在經常使用的函式中,我們不應該頻繁地呼叫這個建構函式。

使用Function()建構函式的另一個原因是它能夠將函式定義為JavaScript表示式的一部分,而不是將其定義一個語句,這種情況下使用它就顯得比較的方面,甚至可以說精緻。

3:函式直接量

函式直接量是一個表示式,它可以定義匿名函式。函式直接量的語法和function語句非常相似,只不過它被用作表示式,而不是用作語句,而且也無需指定函式名。下面的三行程式碼分別使用function()語句、Funciont()建構函式和函式直接量定義了三個基本上相同的函式:

function f(x){return x*x}; var f=new Function("x","return x*x;"); var f=function(x){reurn x*x};

雖然函式直接量建立的是未命名函式,但是它的語法也規定它可以指定函式名,這在編寫呼叫自身的遞迴函式時非常有用。

例如:

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

上面的程式碼定義了一個未命名函式,並對它的引用儲存在變數f中。它並沒有真正的建立一個名為fact()的函式,只是允許函式體用這個名字來引用自身。但是要注意,JavaScript1.5之前的版本中沒有正確實現這種命名的函式直接量。

函式直接量的用法和用Function()建構函式建立函式的方法非常相似。由於它們都是由JavaScript的表示式建立的,而不是由語句建立的,所以使用它們的方式也就更加靈活,尤其適用於那些只使用一次,而且無需命名的`函式。例如,一個使用函式直接量表達式指定的函式可以儲存在一個變數中、傳遞給其他的函式甚至被直接呼叫:

a[0]=function(x){return x*x;};//定義一個函式並儲存它 (function(a,b){return a-b;});//定義一個函式;把它傳遞給另一個函式 var tensquared=(function(x){return x*x;})(10);

和Function()建構函式一樣,函式直接量建立的是未命名函式,而且不會自動地將這個函式儲存在屬性中。但是,比起Function()建構函式來說,函式直接量有一個重要的優點。由Function()建構函式建立的函式的主體必須用一個字串說明,用這種方式來表達一個長而複雜的函式是狠笨拙的。但是函式直接量的主體使用的卻是標準的JavaScript語法。而且函式直接量只被解析一次,而作為字串傳遞給Function()建構函式的JavaScript程式碼則在每次呼叫建構函式時只需被解析一次和編譯一次。

在JavaScript1.1中,可以使用建構函式Function()來定義函式,在JavaScript1.2和其後的版本中,還可以使用函式直接量來建構函式。你應該注意這兩種方法之間的重要差別。

首先,建構函式Function()允許在執行時動態地建立和編譯JavaScript程式碼。但是函式直接量卻是函式結構的一個靜態部分,就像function語句一樣。

其次,作為第一個差別的必然結果,每次呼叫建構函式Function()時都會解析函式體並且建立一個新東漢數物件。如果對建構函式的調用出現在一個迴圈中,或者出現在一個經常被呼叫的函式中,這種方法的效率非常低。另一個方面,函式直接量或出現在迴圈和函式中的巢狀函式不是在每次呼叫時都被重新編譯,而且每當遇到一個函式直接量時也不建立一個新的函式物件。

Function()建構函式和函式之間量之間的第三點差別是,使用建構函式Function()建立的函式不使用詞法作用域,相反的,它們總是被當作頂級函式來編譯,就像下面程式碼所說明的那樣:

var y="global"; function constructFunction() { var y="local"; return new Function("return y");//不捕捉區域性作用域。 } //這行程式碼將顯示"global",因為Function()建構函式返回的函式並不使用區域性作用域。 //假如使用一個函式直接量,這行程式碼則可能顯示"local"。 alert(constructFunction());