整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          什么是JavaScript函數(shù)基礎(chǔ)知識(全),讓你徹

          什么是JavaScript函數(shù)基礎(chǔ)知識(全),讓你徹底搞懂函數(shù)

          果您已經(jīng)開始學(xué)習(xí)JavaScript了,那是時候了解下基本函數(shù)了,本章節(jié)為大家分享JavaScript基本函數(shù)!

          什么是函數(shù)?

          一般來說,函數(shù)是經(jīng)過精心挑選和設(shè)計以執(zhí)行特定任務(wù)的子程序

          它是一個對象。要執(zhí)行一個函數(shù),您將調(diào)用它,也稱為調(diào)用函數(shù)。您還可以將值傳遞給函數(shù)以在函數(shù)中使用。事實上,函數(shù)總是會返回一個值。因此,如果您不指定返回值, JavaScript 函數(shù)將返回 undefined

          什么是 JavaScript 函數(shù)?

          您可以通過多種方式在代碼中定義 JavaScript函數(shù)。首先,您將使用函數(shù)聲明。您可以使用關(guān)鍵字function創(chuàng)建函數(shù)聲明,然后添加函數(shù)的名稱。當(dāng)您使用函數(shù)聲明時,您將提升函數(shù)定義,這將允許您在定義函數(shù)之前使用它。

          接下來,您有一個任務(wù) JavaScript 函數(shù)表達(dá)式。這定義了一個匿名或命名的名字 JavaScript 函數(shù)。匿名函數(shù)是尚未命名的函數(shù)。因為函數(shù)表達(dá)式不能被提升,所以在定義它們之前不能使用它們。

          創(chuàng)建函數(shù)表達(dá)式的較短語法是箭頭函數(shù)。這種類型的 JavaScript 函數(shù)不會創(chuàng)建自己的值。它僅用于編寫不同的功能。

          參數(shù)(arguments)和參數(shù)(parameters)

          您可能聽說過“arguments”和“parameters”這兩個術(shù)語可以互換使用,這可能會導(dǎo)致您認(rèn)為它們是同一個東西。雖然這兩個術(shù)語在涉及 JavaScript 函數(shù)時非常相似,但您應(yīng)該了解一些非常重要的區(qū)別。

          參數(shù)用于定義JavaScript 函數(shù)。這意味著參數(shù)是在定義 JavaScript 函數(shù)是最初創(chuàng)建的名稱。在進(jìn)行函數(shù)定義時,您可能會傳遞多達(dá) 255 個 JavaScript 參數(shù)。使用逗號將參數(shù)與下一個參數(shù)隔開。

          如何調(diào)用函數(shù)

          當(dāng)您調(diào)用JavaScript 函數(shù)時,您正在執(zhí)行該函數(shù),也稱為調(diào)用它。要調(diào)用函數(shù),首先添加JavaScript 函數(shù)的名稱,后跟兩個括號。為了幫助您更好地理解 JavaScript的這個組件。

          如果您當(dāng)前使用的是Google Chrome,請打開開發(fā)者控制臺。這將允許您練習(xí) JavaScript 函數(shù)。要打開此開發(fā)人員控制臺,請按 Ctrl + Shift + J(對于 Windows)Cmd + Opt + J(對于 Mac)

          首先,讓我們定義一個名為 logIt的 JavaScript 函數(shù)。這個 JavaScript 函數(shù)將有一個參數(shù):“city”。執(zhí)行完此函數(shù)后,我們將名稱記錄到控制臺中。它看起來像這樣:

          如果你想調(diào)用這個函數(shù),你可以調(diào)用它并將它傳遞給一個參數(shù)。在此示例中,JavaScript 函數(shù)名為 Dallas。它看起來像這樣:

          如果您的函數(shù)沒有任何參數(shù),則可以使用一組空括號來調(diào)用它。它看起來像這樣;

          什么是 JavaScript 函數(shù)返回?

          在 JavaScript 中,除非您另行指定,否則每個函數(shù)都將返回undefined。讓我們通過調(diào)用一個空的JavaScript 函數(shù)

          在上面的示例中,JavaScript 函數(shù)將返回 undefined。要自定義它將返回什么,我們可以使用關(guān)鍵字“return”,然后是我們希望它返回的值。

          在上面的示例中,我們已經(jīng)告訴 JavaScript 函數(shù)我們希望它返回false。調(diào)用此函數(shù)允許這種情況發(fā)生。這很重要,因為函數(shù)返回的值將返回給函數(shù)的調(diào)用者。

          表達(dá)式將創(chuàng)建一個 JavaScript 函數(shù),該函數(shù)將給出的一個值是什么 num 參數(shù)的兩倍的值。然后,您可以調(diào)用此 JavaScript 函數(shù)并未將返回的值保存到變量中:

          注銷此測試值會返回結(jié)果為 9。關(guān)于 return 語句的另一個重要規(guī)則是它會立即停止函數(shù)。

          JavaScript 函數(shù)對象

          函數(shù)本質(zhì)上是一個函數(shù)對象。這是一個事實,即如果某些東西不是原始的,那么它就是一個對象。JavaScript對象用途廣泛;它甚至可以讓我們將 JavaScript 中的函數(shù)作為參數(shù)移動到另一個 JavaScript 函數(shù)。

          當(dāng)一個 JavaScript 函數(shù)接受另一個參數(shù)函數(shù)時,這是一個高階函數(shù)。無論您目前是否參加了會議 JavaScript 訓(xùn)練營,您很可能已經(jīng)在 JavaScript 使用過一個高階函數(shù),但并沒有意識到這一點。這方面的兩個例子是Array.prototype.filterArray.prototype.mapand。這些只是眾多高階函數(shù)中的一小部分。

          總結(jié):總而言之,JavaScript 函數(shù)是一個對象。它是子程序的一部分,其目標(biāo)是完成一種特定類型的任務(wù)。一個 JavaScript 函數(shù)被提升,而一個表達(dá)式?jīng)]有。要執(zhí)行 JavaScript 函數(shù),您將調(diào)用它,這稱為調(diào)用函數(shù)。您也可以將值傳遞給函數(shù),以便在函數(shù)中使用它,也稱為參數(shù),而其本身的值是參數(shù)。一個函數(shù)總是會返回一個值,但是 JavaScript 中沒有返回值的函數(shù)會以未定義的形式返回。

          文共2416字,預(yù)計學(xué)習(xí)時長5分鐘

          圖片來源:Unsplash/Luca Bravo

          函數(shù)是編程中的關(guān)鍵部件之一。這些函數(shù)可執(zhí)行特定任務(wù),并可反復(fù)調(diào)用執(zhí)行。將Javascript中的函數(shù)和其他編程語言中的函數(shù)相比較,其中最大的區(qū)別在于Javascript函數(shù)為一級對象,這意味著Javascript中的函數(shù)表現(xiàn)類似于對象,可作為變量、數(shù)組和其他對象。


          本文就定義函數(shù)的三種不同方法進(jìn)行討論:

          1. 函數(shù)聲明

          2. 函數(shù)表達(dá)式

          3. 生成器函數(shù)


          1. 函數(shù)聲明


          函數(shù)聲明可能是最常見的方式了。觀察如下語句:

          function name (parameter)
          {
           statements 
          }
          


          函數(shù)聲明語句

          函數(shù)由關(guān)鍵字函數(shù)、函數(shù)的強制名稱和括號內(nèi)的參數(shù)組成(定義函數(shù)也可無參數(shù))。最后,大括號內(nèi)則是函數(shù)的主體,用以執(zhí)行實際任務(wù)。


          理解形參和實參的區(qū)別很重要。形參是定義函數(shù)時的一個變量。在調(diào)用函數(shù)時,實參則是輸入函數(shù)形參的實際數(shù)據(jù)。


          首先,看一個簡單實例:

          function hello(name)
          {
          console.log("Hello "+ name)
          }
          hello('stuti')
          // Hello stuti
          hello(12)
          // Hello 12
          


          名為hello的函數(shù)以實際參數(shù)名稱聲明,在控制臺記錄消息。從本例中,可以看出,因為實際參數(shù)上無指定類型,所以其既適用于string函數(shù),也適用于number函數(shù)。倘若只是希望該函數(shù)是一個名稱而不是數(shù)值呢?很遺憾,由于Javascript中沒有預(yù)建法來實現(xiàn)這一點,必須手動確定輸入函數(shù)的實際參數(shù)類型,如下所示:


          function hello(name) {
           if (typeof name==='string')
           console.log("Hello " + name)
           else
           console.log("Please input a Name")
          }
          hello(12) 
          // Plese input a Name
          


          默認(rèn)情況下,函數(shù)返回未定義變量。若要返回任何其他值,則函數(shù)必須具備返回語句,而由該語句指定返回值。


          function something(){
          }
          console.log(something()) // undefined
          function notSomething(){
           return 1
          }
          console.log(notSomething()) // 1
          


          函數(shù)聲明中提升是什么?


          簡單地說,這意味著在執(zhí)行代碼時,無論何處聲明函數(shù)或變量,它們均會移動至作用域的頂部。這也就是所謂的提升。


          觀察下方實例:

          myName()
          // My name is Stuti Chahuhan
          function myName() {
           console.log(`My name is Stuti Chauhan`)
          }
          


          函數(shù)聲明中的提升

          此處甚至是在聲明之前就調(diào)用了這個函數(shù)——提升。



          2. 函數(shù)表達(dá)式

          圖片來源:unsplash.com/@creativegangsters

          函數(shù)表達(dá)式與函數(shù)聲明極為相似,連語句都不甚相同。最主要的區(qū)別在于函數(shù)表達(dá)式不以關(guān)鍵字函數(shù)開頭,且函數(shù)名稱可選,在此情況下,該函數(shù)表達(dá)式則可以成為一個匿名函數(shù)。如果函數(shù)有名稱,則將其稱為命名函數(shù)表達(dá)式。

          let checkNumber=function check (num){
           return (num %2==0)?"even" : "odd"
           }
          console.log(checkNumber(50)) 
          // even
          


          函數(shù)表達(dá)式的例子

          現(xiàn)在來觀察一下定義上述函數(shù)的匿名法。

          //Anonymous Function 
          let checkNumber=function (num){
           return (num %2==0)?"even" : "odd"
           }
          console.log(checkNumber(50)) 
          // even
          


          匿名函數(shù)表達(dá)式

          函數(shù)聲明和函數(shù)表達(dá)式最關(guān)鍵的區(qū)別就在于函數(shù)表達(dá)式無提升功能。若在函數(shù)表達(dá)式中嘗試與提升函數(shù)聲明相同的項目,則會出現(xiàn)報錯。

          myName()
          // ReferenceError: myName is not defined
          let myName=function () {
           console.log(`My name is Stuti Chauhan`)
          }
          


          函數(shù)表達(dá)式中無提升

          IIFE(立即執(zhí)行函數(shù)表達(dá)式)


          這意味著函數(shù)一旦定義就開始運行,而函數(shù)表達(dá)式附在分組操作符()中,

          ( function () {
           let num=4
           return num
           })
          //4
          


          為什么典型的函數(shù)表達(dá)式需要IIFE?一般定義一個函數(shù),隨后多次調(diào)用。但倘若只想調(diào)用一次用來生成輸出,并且不再使用該函數(shù)呢?由此就出現(xiàn)了IIFE。該函數(shù)會立即執(zhí)行,并在以后不再經(jīng)程序訪問。因為不需再調(diào)用該函數(shù),所以它也不需要名稱,因此匿名函數(shù)表達(dá)式首選IIFE。

          3. 生成器函數(shù)

          圖片來源:unsplash.com/@roman_lazygeek

          普通函數(shù)遵循運行-完成的模型,不能在執(zhí)行最后一行之前停止運行。若想在執(zhí)行過程中退出,必須返回或拋出一個錯誤。


          而生成器函數(shù)可以在執(zhí)行過程中停止。當(dāng)其調(diào)回時,仍然從停止的地方繼續(xù)。


          該函數(shù)與普通函數(shù)一樣進(jìn)行聲明,但不同之處在于生成器函數(shù)在function關(guān)鍵字后面帶有星號*,其間可包含任意數(shù)量的空格。


          還有一點需要注意:在JavaScript中,生成器是一個函數(shù),該函數(shù)返回一個對象,在該對象上可調(diào)用next(),每次調(diào)用next()都會返回一個結(jié)構(gòu)如下的對象:

          { 
           value: Any,
           done: true|false
          } 
          


          此對象包含兩個屬性:value和done。Value是對象的實際值,而done規(guī)定了函數(shù)終止的屬性——默認(rèn)值為false,當(dāng)其變?yōu)閠rue時,則函數(shù)停止。


          通過一個簡單的例子來理解這點:

          function * generatorFunction()
          { 
           console.log('first to execute');
           yield 'takes a pause'; 
           
           console.log(' printed after the pause'); 
           yield 'end of the function';
           
          }
          const gen=generatorFunction();
          console.log(gen.next().value); // first to execute
           // takes a pause
          console.log(gen.next().value); // printed after the pause
           // end of the function
          console.log(gen.next().value); 
           // undefined
          


          函數(shù)本體中,不使用return關(guān)鍵字——而是使用yeild,如果使用了return,則會將done屬性更改為true,函數(shù)將結(jié)束——之后的任何操作都不會執(zhí)行。Yield給出為其分配的值。


          首先,在調(diào)用函數(shù)前先定義函數(shù),同時調(diào)用一個生成器函數(shù),形成一個生成器對象,存儲在變量中。


          然后在使用next()和value屬性時調(diào)用對象。第一次使用next()時,函數(shù)執(zhí)行開始。首先,運行console.log (“首次執(zhí)行”)并將其記錄在控制臺中,然后遇到y(tǒng)ield—輸出 “暫停”值,執(zhí)行停止。


          第二次調(diào)用next()時,它從上次暫停處繼續(xù)。同樣,首先運行console.log(),再次遇到y(tǒng)ield,生成“函數(shù)結(jié)束”值,函數(shù)停止。


          第三次調(diào)用next()時,結(jié)果是未定義。這是因為由生成器函數(shù)生成的對象只能迭代一次——該對象現(xiàn)在是無用的,必須生成一個新對象才能重新啟動程序。

          function* generator() {
           yield "some value";
           return "ends here";
           yield "will never execute";
           yield "never reach here"
          }
          var gen=generator()
          console.log(gen.next()); 
          // { value: "some value", done: false }
          console.log(gen.next()); 
          // { value: "ends here", done: true }
          console.log(gen.next()); 
          // { value: undefined, done: true }
          console.log(gen.next()); 
          // { value: undefined, done: true }
          


          如果使用return而不是yield,那么數(shù)據(jù)的值就會被更改為true,之后就不會執(zhí)行任何操作。與Promise結(jié)合使用時,就異步編程而言,生成器是一個非常強大的工具。該函數(shù)即使不能完全消除回調(diào)的問題,也可以減輕其問題的程度。


          結(jié)論:哪種方法更好?


          事實上,我們不能將其進(jìn)行比較,然后說一個比另一個好——聲明的類型還是取決于具體情況或條件。


          為實現(xiàn)更好的異步功能則使用生成器函數(shù),針對立即執(zhí)行函數(shù)的情況,則使用匿名函數(shù)表達(dá)式。

          留言 點贊 關(guān)注

          我們一起分享AI學(xué)習(xí)與發(fā)展的干貨

          編譯組:柳玥、溫媛

          相關(guān)鏈接:

          https://medium.com/better-programming/three-ways-to-define-functions-in-javascript-750a908e51d9

          如需轉(zhuǎn)載,請后臺留言,遵守轉(zhuǎn)載規(guī)范

          數(shù)-function是Javascript非常重要的概念。


          在寫程序的時候,你會發(fā)現(xiàn)在程序的不同地方會書寫相同的代碼,這個時候就需要引入函數(shù)。


          譬如求一個數(shù)字是不是素數(shù),素數(shù)的定義如下:

          素數(shù)是指一個數(shù)只能被1和本身整除。


          我們就可以用前面的for和if語句來寫一個函數(shù)。


          函數(shù)的語法是這樣:

          • function name(parameters)

            {

            ...body...

            }


            name是函數(shù)的名字。

            parameters是函數(shù)。

            body表示函數(shù)里面的代碼。


            那么求一個數(shù)是不是素數(shù)的函數(shù)如下:

            function isPrimer(a){

            for(var i=1;i<a;i++) {

            if(a%i==0) //如果可以整除

            {

            return false; //return也是一個語法,表示函數(shù)額返回值

            }

            }

            return true;

            }


            定義完函數(shù)以后,我們就可以使用它(這段代碼我們稱為代碼1):

            function isPrimer(a){

            for(var i=1;i<a;i++) {

            if(a%i==0) //如果可以整除

            {

            return false; //return也是一個語法,表示函數(shù)額返回值

            }

            }

            return true;

            }

            var a1=100
            if(isPrimer(a1))

            {

            console.log("這個數(shù)是素數(shù):"+a1);

            }else{

            console.log("這個數(shù)不是素數(shù):"+a1);

            }
            var b1=13
            if(isPrimer(b1))

            {

            console.log("這個數(shù)是素數(shù):"+b1);

            }else{

            console.log("這個數(shù)不是素數(shù):"+b1);

            }

            基于上面的代碼,看到還是有些代碼是重復(fù),我們就可以再提取一個函數(shù),這里名字叫PrintPrimer:

            function PrintPrimer(a){

            if(isPrimer(a)) {

            console.log("這個數(shù)是素數(shù):"+a);

            } else {

            console.log("這個數(shù)不是素數(shù):"+a);

            }

            }

            最后我們代碼綜合在一起,就變成了這樣:


            • var a1=100;

              var b1=13;


              PrintPrimer(a1)

              PrintPrimer(b1)


              最后是綜合例子2:

              function isPrimer(a){

              for(var i=1;i<a;i++) {

              if(a%i==0) //如果可以整除

              {

              return false; //return也是一個語法,表示函數(shù)額返回值

              }

              }

              return true;

              }

              function PrintPrimer(a){

              if(isPrimer(a)) {

              console.log("這個數(shù)是素數(shù):"+a);

              } else {

              console.log("這個數(shù)不是素數(shù):"+a);

              }

              }

              var a1=100;

              var b1=13;


              PrintPrimer(a1);

              PrintPrimer(b1);



              我們看到PrintPrimer函數(shù)可以在內(nèi)部調(diào)用isPrimer函數(shù),而且更近一步,還可以調(diào)用自身,稱為“遞歸”。


              平日下面一個數(shù)字列表:

              1 1 2 3 5 8 。。。。


              這個數(shù)字列表的特別就是,第一和第二項為1,然后后面的數(shù)字是前面兩個數(shù)字的和。


              用Javascript怎么寫這個功能呢?(代碼4)


              • function fab(a){

                if(a==1 || a==0) //調(diào)用自身的截止條件,如果不設(shè)置,容易出現(xiàn)問題。

                return 1;

                else {

                return fab(a-1)+fab(a-2); //調(diào)用自身

                }

                }
                var fab_5=fab(5)console.log("fab(5)="+fab_5)


                好了,關(guān)于JavaScript的函數(shù)今天就到這里,請大家仔細(xì)體會。


          主站蜘蛛池模板: 国产主播福利一区二区| 一区二区三区在线免费观看视频| 无码精品人妻一区二区三区免费看 | 一区视频免费观看| 国产自产V一区二区三区C| 91精品一区国产高清在线| 国产午夜精品一区理论片| 少妇人妻精品一区二区三区| 亚洲av综合av一区| 成人精品一区二区激情| 国产精品成人一区二区| 久久精品岛国av一区二区无码| 一区二区三区杨幂在线观看| 麻豆果冻传媒2021精品传媒一区下载| 日韩有码一区二区| 亚洲一区二区三区乱码A| 国产精品一区二区资源| 国产日韩综合一区二区性色AV| 在线中文字幕一区| 免费精品一区二区三区在线观看| 亚洲一区二区三区无码国产| 精品爆乳一区二区三区无码av| 亚洲国产美国国产综合一区二区 | 肉色超薄丝袜脚交一区二区| 精品一区高潮喷吹在线播放| 国产在线观看91精品一区| 久久99国产精品一区二区| 精品免费国产一区二区三区| 成人精品视频一区二区三区不卡| 91视频一区二区三区| 久久精品中文字幕一区| 久久久久久人妻一区二区三区| 久久久久人妻精品一区三寸蜜桃| 亚洲综合在线一区二区三区| 久久久人妻精品无码一区| 99精品一区二区三区| 国产无人区一区二区三区| 69福利视频一区二区| 中文字幕精品一区二区精品| 在线电影一区二区三区| 亚洲影视一区二区|