#hello,JS:03-01函数

总结:数字+undefined===Nan

一、函数的使用

1、什么是语句:先看这几个概念

表达式:

a=1 a+b
typeof

语句:代表一定功能的表达式的组合

a+b;

2、但是特定功能需要几条语句实现,太复杂

statement1; 
statement2;
 statement3;

那么,可以将语句打包成一个函数,然后调用这个函数即可,如:

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

调用这个函数。调用函数通过函数名称( )的形式调用

doSomething();  //需要的时候就调用

实例:

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

二、声明函数

ECMAScript规定三种声明函数方式

1、函数声明

//使用function关键字可以声明一个函数  
//printName()   即函数名称() ,可调用  
function  printName(){
          console.log('世界');
    } 
 printName();

2、函数表达式

/* 通过var 进行一个声明变量,这里的  变量  等同于 函数表达式*/
 var printName =  function(){
             console.log('饥人谷') 
      };
 printName() 

 //等同于 
 var printName =  3;

函数声明VS函数表达式

3、构造函数(不常用)

通过构造函数,使用new来创建一个函数对象

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

三、参数

1、只使用定义函数较为僵化,可通过参数方式让函数调用、复用。

举例说明:

              function  printName(name){ 
             //括号中的name为函数的参数 
                console.log(name) 
                   }  
           printName('hunger')  
           printName('valley)  //等同于在函数设置变量  
           function  printName(){  //括号为空括号 
              var name = arguments[0]
              console.log(name);  
               } 
              printName('hunger'); 

             //假设没有传递参数 
              function  printName(){  //括号为空括号 
             var name = arguments[0] 
              console.log(name);  
                  }  
                 printName();  //arguments[0] 为undefined,name=undefined ,那么结果为undefined 

            //函数在定义的时候可以写多个参数  
                 function  printPersonInfo(name, age, sex){ 
                    console.log(name)
                    console.log(age)
                     console.log(sex)  }

2、Arguments传参数

通过函数内部的arguments对象获取到该函数的所有传入参数(按顺序传入),通过

console.log(arguments)  //输出每一个参数的值

即:

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、实例

例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,  '男'); 

传递的参数:最终获得的值
name:小明 //函数内部对参数无赋值,所以选择输入的值。 
age:  2  //理由同上 
sex: 男 //理由同上  
0:valley //console.log(arguments)表示输出每一个参数的值。 
于是先读取getInfo函数自己的局部环境,读取到了valley。
于是显示valley。 
1:  2  //先读取getInfo函数自己的局部环境,没读取到值。于是向上找,找到了输入的值2。  
3: 男 //理由同上 
name: valley //在getInfo函数的局部环境里向上读取,在上方发现了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: 小小明 //函数内部对参数无赋值,所以选择输入的值。 
age:  3  //理由同上。 
sex: undefined //第三个参数没有输入,所以显示undefined。  
0: valley //console.log(arguments)表示输出每一个参数的值。于是先读取getInfo函数自己的局部环境,  //读取到了valley。于是显示valley。  
1:  3  //函数内部对参数无赋值,所以选择输入的值。 
name: valley //在函数局部环境内向上读取发现已经对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: 男 //在自己的局部环境的上方没有读取到值,所以向上一级读取,显示为男。
age:undefined //整个环境内都没有赋值,所以显示为undefined sex:undefined //整个环境内都没有赋值,所以显示为undefined  
0: valley //console.log(arguments)表示输出每一个参数的值。于是先读取getInfo函数自己的局部环境, 读取到了valley。于是显示valley。
name:valley //在函数局部环境内向上读取发现已经对name赋值,所以显示valley。

题外话:
函数是有参数的,在声明函数的时候可以在定义的函数旁加一个参数,当你要执行的时候,需要调用带有该参数的函数,如果没有传递这个参数的话,相当于这个带有参数的函数结果就为:undefined
如:

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

 -->输出:undefined

图:


image

5、函数返回值

函数,即把一段语句包装起来,调用函数的参数的时候,就会执行这些语句,更多的是得到一些结果。就像表达式给一个结果,希望函数执行后给一个反馈,我们可以通过return来实现
如:

        function  sum(a,b,c){ 
                console.log(a+b)  //只是把计算的结果展示在控制台,无其他事(用户若不打开控制台无意义)  
                 return a+b }
          var result =  sum(4,6) 
               console.log(result)  //返回10

假设:没有return,会出现什么结果呢?

image

以上结果以说明,console.log(a+b),输出10,只是把计算结果呈现在控制台,表示它做了这件事情,只不过没有把结果返回。但是console.log(a+b)本身也是一个函数,整个函数本质上执行的结果为undefined,调用result,结果也是undefined

❌错误写法:

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、什么是函数重载

重载是很多面向对象语言实现多态的手段之一,在静态语言中确定一个函数的手段是靠方法签名——函数名+参数列表,也就是说相同名字的函数参数个数不同或者顺序不同都被认为是不同的函数,称为函数重载。

2、JS没有函数重载

在JavaScript中没有函数重载的概念,函数通过名字确定唯一性,参数不同也被认为是相同的函数,后面的覆盖前面。函数调用没必要把所有参数都传入,只要你函数体内做好处理就行,但前提是传的参数永远被当做前几个
传递不同的参数,做不同的事情,根据函数中参数类型和个数去进行逻辑判断。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容