JavaScript基础笔记之函数

180 阅读5分钟

JavaScript笔记之函数

什么是函数

说明

​ 就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。

优点

  1. 函数具有“一次定义,多次调用”的优点
  2. 使用函数,可以简化问题,让代码更具有可读性

函数的定义和调用

声明函数

  1. function是声明函数的关键字

  2. 函数是做某件事情,所以函数名一般是动词( 前缀应该为动词 )。

  3. 函数不调用自己不执行, 使用 () 调用函数

    第一种 利用函数关键字命名函数

    function 函数名() {}
    

    第二种 函数表达式

    • 变量名是变量名,不是函数名
    • 跟声明变量差不多,只不过声明函数里面存的是函数
    • 函数表达式可以参数
    let 变量名 = function() {}
    

调用函数

函数名();

函数的封装

说明

​ 就是把一个或多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口。

函数传参

说明

  1. 若函数完成功能需要调用者传入数据,那么就需要用有参数的函数

  2. 这样可以极大提高函数的灵活性

  3. 形参: 声明函数时写在函数名右边小括号里的叫形参(形式上的参数)

  4. 实参:调用函数时写在函数名右边小括号里的叫实参(实际上的参数)

    function 函数名(参数列表) {   //传入数据列表 声明这个函数需要传入几个数据,多个数据用逗号隔开
        函数体
    }
    
    function 函数名(形参1,形参2...) {
    }
    函数名(实参1,实参2...) //在函数名调用的括号里面是实参
    //形参是接受实参的
    

作用

在函数内部某些值不能固定,可以通过参数再调用函数时传递不同的值进去

注意

  • 在函数名调用的括号里面是实参

  • 形参是接受实参的

  • 函数的参数可有可无

  • 形参的默认值是undefined

  • 尽量让实参的个数和形参的个数相匹配

  • 形参也可以看作是变量

    形参与实参的匹配问题
    参数个数结果
    实参 = 形参正确输出结果
    形参 < 实参报错,未定义
    实参 < 形参多的形参定义为undefined,undefined进行任何运算结果都是NaN

函数的返回值

说明

  1. 利用return终止函数,return后面的语句不会再执行。
  2. 简单来说: 函数内部不需要 输出结果,而是返回结果
  3. 在函数中使用return时,return只能返回一个值。当需要返回多个值,可以使用数组来实现。
  4. 不能执行多个return,只有第一个return生效
  5. 在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用
  6. 函数可以没有 return,这种情况函数默认返回值为 undefined
  7. 函数有return必须要用变量来接收,再输出

匿名函数

函数可以分为 具名函数 和 匿名函数

//具名函数
声明:function fn() {}
调用:fn()
    
//匿名函数
function() {}

说明

​ 将匿名函数赋值给一个变量,并且通过变量名称进行调用我们将这个称为函数表达式

写法

let fn = function () {}
//调用 
fn()  //函数名()

立即执行函数

避免全局变量之间的污染

不需要调用立即执行

多个立即执行函数要用分号(;)隔开,不然会报错

语法
方式一
(function () {console.log(2) })()
方式二
(function () {console.log(2) }())

JS作用域

说明

  • 通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这 个名字的作用域。
  • 作用的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

全局作用域

全局有效

作用于所有代码执行的 环境(整个 script 标签 内部)或者一个独立的 js 文件

局部作用域

局部有效

作用于函数内的代码环境,就是局部作用域。

因为跟函数有关系,所以也称为函数作用域

块级作用域

{} 内有效

块作用域由 { } 包括,if语 句和for语句里面的{ }等 。

变量的作用域

如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐 但是有一种情况,函数内部的形参可以看做是局部变量。

全局变量

函数外部let 的变量

在任何区域都可以访问和修改

局部变量

函数内部let的变量

局部变量只能在当前函 数内部访问和修改

块级变量

{} 内部的let变量

let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问

作用域链

函数内部访问外部函数的变量,采用的是链式查找的方法决定取哪个值(就近原则)。

案例

//用户输入秒数,获得指定格式,个位数前面补0
function getTime() {
            // 用户输入秒数
            let seconds = +prompt("请输入秒数");
            // 获取时
            let h = parseInt(seconds / 60 / 60 % 24);
            // 获取分
            let m = parseInt(seconds / 60 % 60);
            // 获取秒
            let s = parseInt(seconds % 60);
            // 补零
            h = h < 10 ? '0' + h : h;
            m = m < 10 ? '0' + m : m;
            s = s < 10 ? '0' + s : s;
            console.log(`${seconds}秒等于${h}${m}${s}秒`); //假设总秒数为1000秒,输出 1000秒等于00时16分40秒
        }
        getTime()  //1000秒等于00时16分40秒