#hello,JS:03-01函數(shù)

總結(jié):數(shù)字+undefined===Nan

一、函數(shù)的使用

1、什么是語(yǔ)句:先看這幾個(gè)概念

表達(dá)式:

a=1 a+b
typeof

語(yǔ)句:代表一定功能的表達(dá)式的組合

a+b;

2、但是特定功能需要幾條語(yǔ)句實(shí)現(xiàn),太復(fù)雜

statement1; 
statement2;
 statement3;

那么,可以將語(yǔ)句打包成一個(gè)函數(shù),然后調(diào)用這個(gè)函數(shù)即可,如:

function  doSomething(){ statement1; statement2; statement3;  }

調(diào)用這個(gè)函數(shù)。調(diào)用函數(shù)通過函數(shù)名稱( )的形式調(diào)用

doSomething();  //需要的時(shí)候就調(diào)用

實(shí)例:

function  sum(){ 
          console.log('hello')
          console.log('wangxiaoqin') 
         }  sum()  
//返回
//"hello" 
//"wangxiaoqin"

二、聲明函數(shù)

ECMAScript規(guī)定三種聲明函數(shù)方式

1、函數(shù)聲明

//使用function關(guān)鍵字可以聲明一個(gè)函數(shù)  
//printName()   即函數(shù)名稱() ,可調(diào)用  
function  printName(){
          console.log('世界');
    } 
 printName();

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

/* 通過var 進(jìn)行一個(gè)聲明變量,這里的  變量  等同于 函數(shù)表達(dá)式*/
 var printName =  function(){
             console.log('饑人谷') 
      };
 printName() 

 //等同于 
 var printName =  3;

函數(shù)聲明VS函數(shù)表達(dá)式

3、構(gòu)造函數(shù)(不常用)

通過構(gòu)造函數(shù),使用new來創(chuàng)建一個(gè)函數(shù)對(duì)象

var printName =  new  Function("console.log('Byron');");

三、參數(shù)

1、只使用定義函數(shù)較為僵化,可通過參數(shù)方式讓函數(shù)調(diào)用、復(fù)用。

舉例說明:

              function  printName(name){ 
             //括號(hào)中的name為函數(shù)的參數(shù) 
                console.log(name) 
                   }  
           printName('hunger')  
           printName('valley)  //等同于在函數(shù)設(shè)置變量  
           function  printName(){  //括號(hào)為空括號(hào) 
              var name = arguments[0]
              console.log(name);  
               } 
              printName('hunger'); 

             //假設(shè)沒有傳遞參數(shù) 
              function  printName(){  //括號(hào)為空括號(hào) 
             var name = arguments[0] 
              console.log(name);  
                  }  
                 printName();  //arguments[0] 為undefined,name=undefined ,那么結(jié)果為undefined 

            //函數(shù)在定義的時(shí)候可以寫多個(gè)參數(shù)  
                 function  printPersonInfo(name, age, sex){ 
                    console.log(name)
                    console.log(age)
                     console.log(sex)  }

2、Arguments傳參數(shù)

通過函數(shù)內(nèi)部的arguments對(duì)象獲取到該函數(shù)的所有傳入?yún)?shù)(按順序傳入),通過

console.log(arguments)  //輸出每一個(gè)參數(shù)的值

即:

function  printPersonInfo(name, age, sex){ console.log(name) console.log(age) console.log(sex) console.log(arguments) 即:
console.log(arguments[0]===name) console.log(arguments.length) console.log(arguments[1]  === age)  }

3、實(shí)例

例1:


image

例2:


image

例3:

function  getInfo(name, age, sex){ 
           console.log('name:',name);
           console.log('age:', age); 
           console.log('sex:', sex);
           console.log(arguments); 
            arguments[0]  =  'valley'; 
            console.log('name', name);  
          }  
 getInfo('小明',  2,  '男'); 
 getInfo('小小明',  3); 
 getInfo('男');

即:

function  getInfo(name, age, sex){ 
            console.log('name:',name); 
            console.log('age:', age); 
            console.log('sex:', sex); 
            console.log(arguments);
            arguments[0]  =  'valley'; 
            console.log('name', name); 
     } 
 getInfo('小明',  2,  '男'); 

傳遞的參數(shù):最終獲得的值
name:小明 //函數(shù)內(nèi)部對(duì)參數(shù)無賦值,所以選擇輸入的值。 
age:  2  //理由同上 
sex: 男 //理由同上  
0:valley //console.log(arguments)表示輸出每一個(gè)參數(shù)的值。 
于是先讀取getInfo函數(shù)自己的局部環(huán)境,讀取到了valley。
于是顯示valley。 
1:  2  //先讀取getInfo函數(shù)自己的局部環(huán)境,沒讀取到值。于是向上找,找到了輸入的值2。  
3: 男 //理由同上 
name: valley //在getInfo函數(shù)的局部環(huán)境里向上讀取,在上方發(fā)現(xiàn)了name賦值,所以顯示valley。
function  getInfo(name, age, sex){ 
             console.log('name:',name); 
             console.log('age:', age);
            console.log('sex:', sex); 
            console.log(arguments); 
            arguments[0]  =  'valley'; 
             console.log('name', name);
  } 
 getInfo('小小明',  3); 

name: 小小明 //函數(shù)內(nèi)部對(duì)參數(shù)無賦值,所以選擇輸入的值。 
age:  3  //理由同上。 
sex: undefined //第三個(gè)參數(shù)沒有輸入,所以顯示undefined。  
0: valley //console.log(arguments)表示輸出每一個(gè)參數(shù)的值。于是先讀取getInfo函數(shù)自己的局部環(huán)境,  //讀取到了valley。于是顯示valley。  
1:  3  //函數(shù)內(nèi)部對(duì)參數(shù)無賦值,所以選擇輸入的值。 
name: valley //在函數(shù)局部環(huán)境內(nèi)向上讀取發(fā)現(xiàn)已經(jīng)對(duì)name賦值,所以顯示valley。
function  getInfo(name, age, sex){  
               console.log('name:',name); 
               console.log('age:', age); 
               console.log('sex:', sex);
               console.log(arguments);
               arguments[0]  =  'valley'; 
               console.log('name', name); \
 }  
getInfo('男'); 

name: 男 //在自己的局部環(huán)境的上方?jīng)]有讀取到值,所以向上一級(jí)讀取,顯示為男。
age:undefined //整個(gè)環(huán)境內(nèi)都沒有賦值,所以顯示為undefined sex:undefined //整個(gè)環(huán)境內(nèi)都沒有賦值,所以顯示為undefined  
0: valley //console.log(arguments)表示輸出每一個(gè)參數(shù)的值。于是先讀取getInfo函數(shù)自己的局部環(huán)境, 讀取到了valley。于是顯示valley。
name:valley //在函數(shù)局部環(huán)境內(nèi)向上讀取發(fā)現(xiàn)已經(jīng)對(duì)name賦值,所以顯示valley。

題外話:
函數(shù)是有參數(shù)的,在聲明函數(shù)的時(shí)候可以在定義的函數(shù)旁加一個(gè)參數(shù),當(dāng)你要執(zhí)行的時(shí)候,需要調(diào)用帶有該參數(shù)的函數(shù),如果沒有傳遞這個(gè)參數(shù)的話,相當(dāng)于這個(gè)帶有參數(shù)的函數(shù)結(jié)果就為:undefined
如:

 function  printName(){ 
           var name = arguments[0]
           console.log(name);  
       }
  printName() 

 -->輸出:undefined

圖:


image

5、函數(shù)返回值

函數(shù),即把一段語(yǔ)句包裝起來,調(diào)用函數(shù)的參數(shù)的時(shí)候,就會(huì)執(zhí)行這些語(yǔ)句,更多的是得到一些結(jié)果。就像表達(dá)式給一個(gè)結(jié)果,希望函數(shù)執(zhí)行后給一個(gè)反饋,我們可以通過return來實(shí)現(xiàn)
如:

        function  sum(a,b,c){ 
                console.log(a+b)  //只是把計(jì)算的結(jié)果展示在控制臺(tái),無其他事(用戶若不打開控制臺(tái)無意義)  
                 return a+b }
          var result =  sum(4,6) 
               console.log(result)  //返回10

假設(shè):沒有return,會(huì)出現(xiàn)什么結(jié)果呢?

image

以上結(jié)果以說明,console.log(a+b),輸出10,只是把計(jì)算結(jié)果呈現(xiàn)在控制臺(tái),表示它做了這件事情,只不過沒有把結(jié)果返回。但是console.log(a+b)本身也是一個(gè)函數(shù),整個(gè)函數(shù)本質(zhì)上執(zhí)行的結(jié)果為undefined,調(diào)用result,結(jié)果也是undefined

?錯(cuò)誤寫法:

function  sum(a,b,c){ 
             return console.log(a+b) 
     }  
       var result =  sum(4,6) 
        console.log(result)  
//返回10  
//undefined

但是有這樣的寫法:

         function  fn(score){ 
                    if(score<0) 
                     return console.log(score)
           } 
               fn(-3)  

//等同于 

            function  fn(score){ 
                    if(score<0)  { 
                        return undefined 
           } 
              console.log(score) 
     }    
             fn(-3)  

    //等同于 
               function  fn(score){  
                         if(score<0)  {
                        } 
                    else{ 
                         console.log(score)  
                    } 
              } 
             fn(-3)

四、重載

1、什么是函數(shù)重載

重載是很多面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)多態(tài)的手段之一,在靜態(tài)語(yǔ)言中確定一個(gè)函數(shù)的手段是靠方法簽名——函數(shù)名+參數(shù)列表,也就是說相同名字的函數(shù)參數(shù)個(gè)數(shù)不同或者順序不同都被認(rèn)為是不同的函數(shù),稱為函數(shù)重載。

2、JS沒有函數(shù)重載

在JavaScript中沒有函數(shù)重載的概念,函數(shù)通過名字確定唯一性,參數(shù)不同也被認(rèn)為是相同的函數(shù),后面的覆蓋前面。函數(shù)調(diào)用沒必要把所有參數(shù)都傳入,只要你函數(shù)體內(nèi)做好處理就行,但前提是傳的參數(shù)永遠(yuǎn)被當(dāng)做前幾個(gè)
傳遞不同的參數(shù),做不同的事情,根據(jù)函數(shù)中參數(shù)類型和個(gè)數(shù)去進(jìn)行邏輯判斷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容