js基础--函数篇

207 阅读4分钟

JavaScript

函数

将完成某一特定功能的代码封装起来,并且可以重复调用的代码块。

  • 一次封装多次使用
  • 根据不同的参数返回不同值
  • 代码简洁,便于维护

创建方式

  • 具体函数

    function 变量名(){
    
    }
    
  • 匿名函数/字面量

    var 变量名=function(){
    }
    
  • 实例化构造函数

    var 变量名=new Function()
    

调用方式

  • 通过括号的方式

    具体函数调用:函数名()
    匿名函数调用:变量名()
    实例化结构函数调用:变量名()
    
  • 自调用

    //第一种
    ( function(){})
    ()
    //第二种
    (function( ){ }())
    
    //第三种
    ! function(){}()
    
  • 通过事件的方式调用

    <div class="box" onlick="fn()">
    
    </div>
    <script>
        function fn(){
            alert(1);
        }
    </script>
    

注意事项

  • 函数名相同,后面的会把前面的覆盖掉
  • 具名函数可以在前后调用,匿名函数只能在后面调用
  • 在不同script代码块种,具名函数匿名函数只能在后面代码块调用不能在前面script代码块调用(报错 is not defind)

严格模式对函数也有一些限制:

  • 函数不能以 eval 或 arguments 作为名称;
  • 函数的参数不能叫 eval 或 arguments;
  • 两个命名参数不能拥有同一个名称。

参数

  • 实参:函数调用的时候 传入 的参数

  • 形参:函数声明的时候 接受 的参数

    function fn(n){
        console .log(n)
    }
    fn(100)
    

    参数详解

    • 参数可以是任意数据类型

    • 参数个数

      • 形参和实参一一对应
      • 形参>实参,多余的是undefined
      • 形参<实参
      • 函数声明自动创建arguments对象 arguments 只能用在函数内部 外部报错 arguments 用来存储参数信息 下标:排序
      function fn(){
          console.log(arguments);
          console.log(arguments[0]);//10
          console.log(arguments[1]);//true
          console.log(arguments[2]);//张三
          console.log(arguments.length);//参数个数
      
      }
      fn (10,true,"张三")
      

      返回值

      需要对函数结果进行处理的时候需要用到函数返回值。

      return 需要返回的值

      终止当前函数

      返回值可以是任意的数据类型

      任何一个函数都有返回值

      如果一个函数没有返回值,默认返回undefined

      如果函数返回多个值,返回最后一个

      function fn(){
          return 100;
      }
      var reult=fn();
      console.log(result);//100
      
      

运行环境

  • 宿主环境:浏览器
  • 执行环境:
    • 全局
    • 局部(函数)

作用域

作用域即一段代码的范围

  • 全局变量:在全局变量下用 var 声明的变量或者函数
  • 局部变量:在函数环境下声明的变量或者函数

作用域链

在使用变量或者函数的时候,会在当前环境中去找,

当前环境找不到回去上一个环境中去找,上一个找不大到再上一个,直到找到全局变量window为止,找不到报错,函数

undifent

预解析

代码 执行顺序

  • 从上到下
  • 解析过程中遇到全局变量或者全局函数提前解析到内存中
  • 函数内部程序什么时候调用什么时候执行
  • 如果遇到多个script 代码块按照如上顺序执行

回调函数

回调函数。1

回调函数会造成回调地狱

function  fn(callback)  //callback 就是aa
//既然是函数就能用()调用
//调用的同时有可以传参,cc函数又是回调函数
var result = callback(10, function cc(){});
console.log( result )    // result 就是aa的返回值
}
function aa(){};
fn (aa)

递归

在函数内部调用自己,但是必须要有一个终止条件,

否则会造成堆栈溢出

案例:阶乘

function jieCheng(n){
     if(n<=1){
        return 1;
     }
     else return n * jieCheng(n - 1)   
} 
    alert(jieCheng(prompt("你要求几的阶乘")) )  

闭包函数

闭包(closure)是定义在一个外部函数内部,并且能够访问外部函数中局部变量、参数、其他内部函数的函数,内部函数在包含它的外部函数之外被调用就形成闭包

闭包特点:

  • 函数内部嵌套函数
  • 函数内部可以访问外部函数中的变量或者参数
  • 内部函数在外部函数被调用

典型的闭包:

  • 在一个函数内部返回一个函数
  • 在函数内部 函数自调用

闭包缺点:常驻内存,会增大内存使用量,使用不当很容易造成内存泄漏

一般函数执行完必后,局部活动对象就会被销毁,内存中仅仅保存全局作用域。而闭包函数常驻内存,变量不会被销毁。

闭包好处:

  • 避免全局变量污染

  • 私有成员的存在

      function fn1(n){
    
                return  function (num){
                     return n*num ;
                }
            }
            console.log(fn1(3)(2)); /
    

内置顶层函数

ECMAScript自带的全局环境下的函数

  • Number()将任数据类型转换成数字
  • parseInt()将任数据类型转换成整数
  • parseFloat()将任数据类型转换成浮点数
  • String()将任数据类型转换成字符串
  • Boolean()将任数据类型转换成布尔类型
  • isNaN()检测是否能转换为数字可以false 不可以 true
  • eval("js代码")解析字符串js代码

数据类型转换

  • 强制数据类型

    • Number()将任数据类型转换成数字
    • parseInt()将任数据类型转换成整数
    • parseFloat()将任数据类型转换成浮点数
    • String()将任数据类型转换成字符串
    • Boolean()将任数据类型转换成布尔类型
  • 隐式数据类型转换

    算术运算符,逻辑运算符,关系运算符,if分支,三元运算符......