淺析javascript函數定義的幾種區別

來源:互聯網
上載者:User

 本篇文章主要是對javascript函數定義的幾種區別進行了詳細的總結介紹,需要的朋友可以過來參考下,希望對大家有所協助

javascript函數的定義 1:調用關鍵字function來構造,如:function distance(x1,x2,y1,y2){var dx=x2-x1;var dy=y2-y1;return Math.sqrt(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;};//定義一個函數並儲存它a.sort(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()); 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.