一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

javascript中定義函數的區別

時(shí)間:2024-06-07 12:01:09 JavaScript 我要投稿
  • 相關(guān)推薦

javascript中定義函數的區別

  1:調用關(guān)鍵字function來(lái)構造

  如:

  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");

  這行代碼創(chuàng )建了一個(gè)新函數,該函數和你所熟悉的語(yǔ)法定義的函數基本上時(shí)等價(jià)的:

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

  Functino()構造函數可以接受任意多個(gè)字符串參數。它的最后一個(gè)參數時(shí)函數的主體,其中可以包含任何JavaScript語(yǔ)句,語(yǔ)句之間用分號分隔。其他的參數都是用來(lái)說(shuō)明函數要定義的形式參數名的字符串。如果你定義的函數沒(méi)有參數,那么可以只需給構造函數傳遞一個(gè)字符串(即函數的主體)即可。

  注意,傳遞給構造函數Function()的參數中沒(méi)有一個(gè)用于說(shuō)明它要創(chuàng )建的函數名。用Function()構造函數創(chuàng )建的未命名函數有時(shí)被成為“匿名函數”。

  你可能非常想知道Function()構造函數的用途是什么。為什么不能只用function語(yǔ)句來(lái)定義所有的函數呢?原因是Function()構造函數允許我們動(dòng)態(tài)地建立和編譯一個(gè)函數,它不會(huì )將我們限制在function語(yǔ)句預編譯的函數體中。這樣做帶來(lái)的負面影響效應就是每次調用一個(gè)函數時(shí),Function()構造函數都要對它進(jìn)行編譯。因此,在循環(huán)體中或者在經(jīng)常使用的函數中,我們不應該頻繁地調用這個(gè)構造函數。

  使用Function()構造函數的另一個(gè)原因是它能夠將函數定義為JavaScript表達式的一部分,而不是將其定義一個(gè)語(yǔ)句,這種情況下使用它就顯得比較的方面,甚至可以說(shuō)精致。

  3:函數直接量

  函數直接量是一個(gè)表達式,它可以定義匿名函數。函數直接量的語(yǔ)法和function語(yǔ)句非常相似,只不過(guò)它被用作表達式,而不是用作語(yǔ)句,而且也無(wú)需指定函數名。下面的三行代碼分別使用function()語(yǔ)句、Funciont()構造函數和函數直接量定義了三個(gè)基本上相同的函數:

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

  雖然函數直接量創(chuàng )建的是未命名函數,但是它的語(yǔ)法也規定它可以指定函數名,這在編寫(xiě)調用自身的遞歸函數時(shí)非常有用。

  例如:

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

  上面的代碼定義了一個(gè)未命名函數,并對它的引用存儲在變量f中。它并沒(méi)有真正的創(chuàng )建一個(gè)名為fact()的函數,只是允許函數體用這個(gè)名字來(lái)引用自身。但是要注意,JavaScript1.5之前的版本中沒(méi)有正確實(shí)現這種命名的函數直接量。

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

  a[0]=function(x){return x*x;};//定義一個(gè)函數并保存它 a.sort(function(a,b){return a-b;});//定義一個(gè)函數;把它傳遞給另一個(gè)函數 var tensquared=(function(x){return x*x;})(10);

  和Function()構造函數一樣,函數直接量創(chuàng )建的是未命名函數,而且不會(huì )自動(dòng)地將這個(gè)函數存儲在屬性中。但是,比起Function()構造函數來(lái)說(shuō),函數直接量有一個(gè)重要的優(yōu)點(diǎn)。由Function()構造函數創(chuàng )建的函數的主體必須用一個(gè)字符串說(shuō)明,用這種方式來(lái)表達一個(gè)長(cháng)而復雜的函數是狠笨拙的。但是函數直接量的主體使用的卻是標準的JavaScript語(yǔ)法。而且函數直接量只被解析一次,而作為字符串傳遞給Function()構造函數的JavaScript代碼則在每次調用構造函數時(shí)只需被解析一次和編譯一次。

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

  首先,構造函數Function()允許在運行時(shí)動(dòng)態(tài)地創(chuàng )建和編譯JavaScript代碼。但是函數直接量卻是函數結構的一個(gè)靜態(tài)部分,就像function語(yǔ)句一樣。

  其次,作為第一個(gè)差別的必然結果,每次調用構造函數Function()時(shí)都會(huì )解析函數體并且創(chuàng )建一個(gè)新東漢數對象。如果對構造函數的調用出現在一個(gè)循環(huán)中,或者出現在一個(gè)經(jīng)常被調用的函數中,這種方法的效率非常低。另一個(gè)方面,函數直接量或出現在循環(huán)和函數中的嵌套函數不是在每次調用時(shí)都被重新編譯,而且每當遇到一個(gè)函數直接量時(shí)也不創(chuàng )建一個(gè)新的函數對象。

  Function()構造函數和函數之間量之間的第三點(diǎn)差別是,使用構造函數Function()創(chuàng )建的函數不使用詞法作用域,相反的,它們總是被當作頂級函數來(lái)編譯,就像下面代碼所說(shuō)明的那樣:

  var y="global"; function constructFunction() { var y="local"; return new Function("return y");//不捕捉局部作用域。 } //這行代碼將顯示"global",因為Function()構造函數返回的函數并不使用局部作用域。 //假如使用一個(gè)函數直接量,這行代碼則可能顯示"local"。 alert(constructFunction());

  

【javascript中定義函數的區別】相關(guān)文章:

Javascript函數的定義和用法分析08-15

JavaScript中push(),join() 函數實(shí)例詳解09-05

JavaScript類(lèi)定義原型方法的兩種實(shí)現的區別07-11

PHP中的排序函數區別分析08-23

淺析jQuery 遍歷函數javascript08-06

javascript閉包的定義及應用實(shí)例分析08-25

最常用的20個(gè)javascript方法函數09-10

JavaScript日期時(shí)間格式化函數08-29

JavaScript中的with關(guān)鍵字07-24

在Java中執行JavaScript代碼07-14

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看