一、函数定义

1.方式一       function 函数名(参数){  函数体  }——————函数声明的方法

 function fn(a){console.log(a);};

2.方式二      var  变量名  =  function(参数){  函数体  }——————函数表达式

  var fn=function(a){console.log(a);};

3.注意的问题:

  • 函数必须先定义,再调用
       //先声明function fn(a){console.log(a);}//调用函数fn(1);

  • 函数最好一个功能一个函数
  • 函数推荐使用驼峰式命名
     function getMax(a,b){if(a<b){console.log(b);}else{console.log(a);}};getMax(2,3);//3

  • 有名字的函数称为命名函数;反之,没有名字的函数称为匿名函数
  • 方式二定义的函数称为函数表达式,把一个函数给一个变量,调用函数用   变量名(参数)
  • 函数表达式声明的函数后面要加分号
  • 区别:函数声明的方法重名会覆盖,函数表达式相当于变量的再赋值
       function f1(){console.log("我是第一个函数");};function f1(){console.log("我是第二个函数,我覆盖了第一个函数")};f1();//我是第二个函数,我覆盖了第一个函数

       var f2=function(){console.log("我是第一个函数")};f2=function(){console.log("我是第二个函数") };f2();//我是第二个函数

  • 函数的自调用,没有名字,调用------声明的同时,一次性的
       fn=function(){console.log("函数fn代表整个函数代码,后面加括号就是调用");}();//会输出内容,相当于fn()的调用,简写版

二、参数

1.形参:函数定义的时候,小括号里面的变量

2.实参:函数再调用的时候,小括号里面的变量或者值

 //声明定义函数的时候,a和b就是形参function getMax(a,b){if(a<b){console.log(b);}else{console.log(a);}}
//调用函数的时候,传入的值,2和3就是实参getMax(2,3);//3

3.形参个数和实参个数可以不一致

      function getMax(a,b,c){if(a<b){console.log(b);}else{console.log(a);}}getMax(2);//当传入的是一个值得时候,输出就是第一个参数a的值2getMax(2,3);//形参多于实参,输出依然是3getMax(2,3,4,5);//实参多于形参,输出也是3

三、return返回

1.return后面有内容,这个内容被返回了

     function getSum(a,b){return a+b;};console.log(getSum(2,3));//5

2.类型:有参数有返回值/没有返回值,没有参数有返回值/没有返回值

常用:

      //有参数有返回值function getSum(a,b){return a+b;};console.log(getSum(3,4))//7//有参数没有返回值function sayHi(a){console.log("这是我输入的语句:"+ a +"!")};sayHi("今天天气真好");//这是我输入的语句:今天天气真好!

3.函数没有返回值,但是接收了,结果是undefined

      function getSum(a,b){var c=a+b;}console.log(getSum(2,4));//undefined

4.没有明确的返回值,即return后面没有内容,结果也是undefined

       function getSum(a,b){var c=a+b;return;}console.log(getSum(2,4));//undefined

5.return后面的代码不会执行

        function getSum(a,b){var c=a+b;return c;console.log("我在return的后面,不会执行了");};console.log(getSum(2,4));//6

6.有return最好设置定义一个变量去接受它,接收后这个变量就可以去进行其他操作,或者输出,或者进行运算等等

   function getSum(a,b){return a+b; ;}var result=getSum(10,20);console.log(result); //30

四、变量

1.全局变量:

  • 声明的变量使用var声明,可以在页面的任何位置使用
  • 除了函数以外,其他位置的变量都是全局变量
  • 全局变量如果页面不关闭,就不会释放,站空间内存
        var a=1;//全局变量for(var b=2;b<2;b++){//全局变量console.log("哈哈");}function f1(){var c=1;//不是全局变量
        };console.log(a);//1console.log(b);//2console.log(c);//报错

2.隐式全局变量

  • 声明的变量没有var 声明
  • 隐式全局变量使用delete可以删除
  • 全局变量使用delete不能删除
        var a=10;//显式声明的全局变量b=20;//隐式声明的全局变量console.log(a);//10console.log(b);//20delete a;delete b;console.log(a);//10(依然可以输出,说明delete无效)console.log(b);//报错console.log(typeof(b));//undefined

3.局部变量

  • 在函数内部定义的变量,外面不能使用

            function f1(){var c=1;//局部变量
                console.log(c);};f1();//1console.log(c);//报错

4.全局作用域和局部作用域

  • 全局作用域就是全局变量的使用范围
  • 局部作用域就是局部变量的使用范围

5.作用域链

  • 函数变量是从本作用域开始寻找,从里到外
        var a=10;function f1(){var a=20;var b=a+a;return b;};console.log(f1());//40

  • 示意图

五、预解析

  • 理解:在解析代码之前做的事,把变量的声明和函数的声明提前到当前所在作用域的最前面。

  • 步骤:

  1. 把变量的声明提升到当前作用域的最前面,只提升声明,不会提升赋值
  2. 把函数的声明提升到当前作用域的最前面,只提升声明,不会提升调用
  3. 先提升var ,再提升function
//正常代码,没有预解析之前f1();//前端good!function f1(){var a="good!";console.log("前端"+a);};console.log(b);//undefinedvar b=10;

 //上面的代码通过预解析之后会变成下面这样var b;//var 变量声明提前function f1(){var a;//函数的声明提前,在当前作用域的最前面a="good!";console.log("前端"+a);};//函数的声明提前
        f1();console.log(b);b=10;

  • 只有用函数声明方式定义的函数才会提升function,函数表达式定义的函数是一个变量,提升var

        f1();//报错,因为预解析只提升了var f1;到上面var f1=function(){console.log("前端")};

  • 变量和函数重名,执行函数(表达不准确,主要看代码)

       var a;function a(){console.log("前端大法好");};console.log(a);//输出上面的a函数,而不是undefineda=10;console.log(a);//10

  • 如果有多对的script标签都有相同的名字的函数,

    ①如果函数是通过声明定义的,不会受影响

   <script>function a(){console.log("哈哈")};</script><script>a();//嘿嘿function a(){console.log("嘿嘿")};//函数声明会提前</script>

    ②如果函数是通过函数表达式声明的,会受影响

  <script>var a=function(){console.log("哈哈")};</script><script>a();//哈哈var a=function(){console.log("嘿嘿")};</script>

六、总结

1.argument

  • 当做数组使用,是一种伪数组
  • argument.length可以获取函数在调用传入的个数
        function howManyArgs() {console.log(arguments.length);};howManyArgs("string", 45);//2howManyArgs();//0howManyArgs(12);//1

  • 使用argument[ "   " ] 对象可以获取传入的每个参数的值
      function f1(a,b,c,d) {console.log(arguments[0]);console.log(arguments[1]);console.log(arguments[2]);console.log(arguments[3]);console.log(arguments[4]);};f1(1,2,3,4);//1 2 3 4 undefined

2.函数也是一种数据类型

  • typeof检测出来的类型是function
        function f1() {console.log("good!");};var f2 = function () {console.log("nice");};console.log(typeof(f1)); //functionconsole.log(typeof(f2));//function

3.函数参数的类型

  • 函数参数的数据类型可以是数字、字符串、布尔、数组等等
        function f1(a){console.log(a);};f1(10);//参数是numberf1("嘿嘿");//参数是stringf1(1===2);//参数是Booleanf1([10,20,30,40]);//参数是Arrayvar i=null;f1(i);//参数是nullvar j;f1(j);//参数是undefined

  • 函数也可以作为参数使用,如果一个函数作为参数,那么这个参数(函数)就是回调函数
  • 只要看到一个函数作为参数使用,就是回调函数
       function f1(fn){console.log("我是f1");fn();}function f2(){console.log("我是f2");}f1(f2);//我是f1    我是f2     //注意:是f1(f2),而不是f1(f2())

4.函数可以作为返回值使用

    function f1(){console.log("我是f1");return function f2(){console.log("我是f2");}}f1();//我是f1var ff=f1();//理解f1()是函数f1里面执行的内容,而f1是这个函数的整个表达式,定义一个变量去接受这个函数的调用ff();//我是f1  我是f2 

七、函数案列

  //例1:m-n之间所有数的和function getSum(m,n){var sum=0;for(var i=m;i<=n;i++){sum=sum+i;}return sum;}var result=getSum(1,100);console.log(result);//5050

//例2:圆的面积function area(r){return Math.PI*r*r}var result=area(3);console.log(result);//28.274333882308138

 //例3:判断一个数是不是质数;function prime(num){if(num==2){return true;}for(var i=2;i<num;i++){    if(num%i!==0){return true;}else{return false;}}}var result=prime(6);console.log(result);//flase

//例4:两个数的最大值function getMax(a,b){return a>b?a:b}var result=getMax(2,3);console.log(result);//3

//例5:三个数的最大值function getMax(a,b,c){return a>b?(a>c?a:c):(b>c?b:c);}var result=getMax(2,5,4);console.log(result);//5

//例6:两个数的差function differ(a,b){return a-b;}var result=differ(6,3);console.log(result);//3

//例7:一组数中的最大值function getArrayMax(arr){var max=arr[0];for(var i=0;i<arr.length;i++){if(max<arr[i]){max=arr[i];}}return max;}var arr=[1,2,3,4,5];var result=getArrayMax(arr);console.log(result);//5

//例8:一组数字的和function getSum(arr){var sum=0;for(var i=0;i<arr.length;i++){sum=sum+arr[i];}return sum;}var arr=[1,2,3,4,5];var result=getSum(arr);console.log(result);//15

//例9:数组反转function rev(arr){for(i=0;i<arr.length/2;i++){var temp=arr[i];arr[i]=arr[arr.length-1-i];arr[arr.length-1-i]=temp;}return arr;}console.log(rev([1,2,3,4,5]));//(5) [5, 4, 3, 2, 1]

//例10:冒泡排序(从大到小)function pup(arr){for(var i=0;i<arr.length-1;i++)for(var j=0;j<arr.length-1-i;j++){if(arr[j]<arr[j+1]){var temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}return arr;}console.log(pup([1,5,3,7,4,9]))//(6) [9, 7, 5, 4, 3, 1]

//例11:阶乘和function floor(num){var sum=1;for(var i=1;i<=num;i++){sum=sum*i}return sum;}var result=floor(5);console.log(result);//120

//例12:菲波那契数列function rab(num){num1=1;num2=1;sum=0;if(num==1||num==2){sum=1;}for(var i=3;i<=num;i++){sum=num1+num2;num1=num2;num2=sum;}return sum;}var result=rab(12);console.log(result);//144

//输入年月日,返回是这一年的第几天
        function getDays(year, mouth, day) {var days = day;//如果月份是1月,直接返回天数if (mouth == 1) { return days;}//如果月份是其他月,先定义数组,循环月份求和var mouths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];for (i = 0; i < mouth - 1; i++) {days = days + mouths[i];}//判断这一年是不是闰年,并且如果月份大于2,多一天if (year % 4 == 0 && year % 100 !== 0 && mouth >= 2 || year % 400 == 0 && mouth >= 2) {days++;}return days;}var result = getDays(2018, 4, 25);console.log(result);//115

转载于:https://www.cnblogs.com/EricZLin/p/8596229.html

函数(定义、参数、return、变量、作用域、预解析)相关推荐

  1. python 全局变量使用报错没有定义_Python变量作用域代码解析

    本篇文章小编给大家分享一下Python变量作用域代码解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 特点 python的作用域是静态的,在源代码中 ...

  2. matlab中函数参数和变量作用域

    函数参数和变量作用域 函数参数的可调性 全局变量 局部变量 函数参数的可调性 nargin →判断输入实参的个数 nargout →判断输出实参的个数 这两个预定义变量有什么用处呢?看下面一个函数: ...

  3. 函数(arguments),作用域,预解析,对象

    函数(arguments) JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性.也就是说所有函数都内置了一个arguments对象,arguments对 ...

  4. js 默认的参数、可变的参数、变量作用域

    可以通过arguments对象来实现可变的参数 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. arguments是一个数组对象,可以通过下标来实别参数的位置 ...

  5. function——函数声明头的提升和预解析

    函数: 即function语句的集合,就是将多个语句封装到一起: 函数的执行要会自己遍历,遇见函数 a():执行语句,就要移交控制权,函数执行完毕之后,控制权又移交回来了! 函数的参数要罗列在func ...

  6. 【C语言进阶】函数三要素,变量作用域、生存周期、存储类型

    目录 写在前面 一.函数的用法 1.声明 2.调用 3.定义 形参与实参类型不一致 形参与实参类型一致 函数值类型与返回值类型不一致 函数值类型与返回值类型一致 二.变量的作用域与生存周期 三.变量的 ...

  7. python函数定义参数类型和返回值类型

    python中我们也可以定义函数的参数类型和返回值类型,如下代码 #函数参数和返回值的类型声明,python函数类型的声明,更加有意义,更加实用一些 def add(a,b):''':param a: ...

  8. linux 变量函数返回值,linux shell 自定义函数(定义、返回值、变量作用域)介绍...

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ f ...

  9. Python自定义函数的创建、调用和函数的参数详解

    这篇文章主要介绍了Python自定义函数的创建.调用和函数的参数.变量作用域等常见问题,需要的朋友可以参考下 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性 ...

  10. matlab调用sh函数,Shell 函数定义与调用

    linux shell 可以用户定义函数,然后在 shell 脚本中可以随便调用. 以一个计算两数之和的函数为例: #! /bin/bash # 函数定义 sum(){ return $(($1+$2 ...

最新文章

  1. 如何管理多个Python版本和虚拟环境
  2. 推荐15个高质量学习网站,仅看一眼,就收获满满,赶紧收藏!
  3. Chrome禁用浏览器跨域拦截
  4. 两幅相同大小图像的相似程度的两个评价指标-PSNR和SSIM
  5. 8 list切片_P018 python基础:数据类型之列表切片02
  6. HTML、CSS、javascript总结
  7. 布尔运算_利用布尔运算拆分汉字
  8. ASP.NET Core之跨平台的实时性能监控
  9. 【信号】函数kill、raise、abort、alarm
  10. Java必备常用操作API
  11. Telnet介绍及其安装
  12. 会计计算机,什么是好的计算机会计软件?
  13. 苹果电脑上几款不错的图片浏览管理工具
  14. 004--python--华氏温度和摄氏温度的转换
  15. 【网络营销】CPA、CPS、CPM、CPT、CPC 是什么
  16. CPU 的 ring0,ring1,ring2,ring3
  17. Python爬虫入门【11】:半次元COS图爬取
  18. FITC-STL,PL;荧光素标记马铃薯凝集素(STL,PL)
  19. Python获取股票机构调研数据
  20. fun和fun()的区别,函数也是对象

热门文章

  1. FCN论文-语义分割
  2. 鼠标控制程序,按住shift显示S,按住Ctrl显示C,按键盘显示D,松开键盘显示U
  3. java通信方式_java 认知底层的五种通信方式
  4. 深度学习知识抽取:属性词、品牌词、物品词
  5. ImportError: libnvinfer.so.7: cannot open shared object file: No such file or directory
  6. openairinterface 中手动安装编译 UHD, Ubuntu 16.04
  7. java点击按钮弹出警告_GUI求教~~~我想点击按钮确定后,弹出一个提示框输入有误!,,…...
  8. t7910安装linux体会_LINUX学习心得体会
  9. 平台的本质——保险公司互联网平台建设系列
  10. 阿里云php-7.2.12 安装