一、JS函数概述:
- 是什么:
- 一个JS代码块
- 一个对象
- 特点:
- 能被多次调用
- 是闭包:可嵌套定义在其他函数中,并且这个内嵌函数可访问在函数作用域的任何变量
- 构造函数:
- 是什么:
- 用来初始化一个新对象的函数
- 是什么:
- 定义函数:
- 方式1:函数声明
- 语法:
- funtion 函数名(){}
- 特点:
- 函数能在定义前调用,因为函数声明会被提升到包含脚本、函数或代码块的顶部
- 语法:
- 方式2:函数表达式
- 语法:
- const/let 名=function(){}或const 常量名=function 函数名(){}
- 注:最佳实践是用const,这样可防止意外又给变量赋予新值
- const/let 名=function(){}或const 常量名=function 函数名(){}
- 特点:
- 函数不能在定义前调用
- 如何提升函数的定义:
- 调用bind()方法
- 语法:
- 方式3:箭头函数
- 语法:
- const 名=(形参)=>{}
- 简洁写法:
- 如果形参只有一个:const 名=形参=>{}
- 如果函数体只有一个return语句:const 名=(形参)=>语句
- 关于return:
- 如果要返回a:const 名=(形参)=>({a})或const 名=(形参)=>{return {a}}
- 特点:
- 从定义自己的环境继承this关键字的值
- 无prototype属性,不能作为新类的构造函数
- 语法:
- 方式4:使用Function()构造函数
- 方式1:函数声明
- 嵌套函数:
- 是什么:
- 嵌套在函数里的函数
- 特点:
- 能访问包含自己的函数或更外层函数的参数和变量
- 是什么:
- this关键字
- 除了箭头函数,嵌套函数不会继承包含函数的this值
- 若嵌套函数被当作方法来调用,那其this值就是调用它的对象
- 若嵌套函数(非箭头函数)被当作函数来调用
- 其this值只可能为全局对象(非严格模式)或undefined(严格模式)
二、调用函数:
-
方式1:函数调用
- 函数名()
-
方式2:方法调用
-
方式3:构造函数调用
- new Object() 或 new Object【无参时】。
- 调用结果:
- 创建一个新的空对象
- 其特点:
- 继承构造函数的prototype属性指定的对象
- 其特点:
- 创建一个新的空对象
-
方式4:间接调用:
- 使用函数内部的方法:(可自行指定调用时的this值)
- call()
- apply()
- 使用函数内部的方法:(可自行指定调用时的this值)
-
方式5:隐式函数调用:
- 需要关注,因为出现隐式调用将会导致bug更难排查
三、函数实参与形参
- 形参:
- 当调用函数时传入的实参少于声明的形参时:
- 额外的形参获得默认值undefined
- 剩余形参:
- ...剩余形参:允许我们调用函数时传入比形参多的任意数量的实参
- 特点:
- 传入的实参首先赋值到非剩余形参
- 然后所有剩余的实参会保存在一数组里赋值给剩余形参
- 当调用函数时传入的实参少于声明的形参时:
- 实参:
- 扩展操作符:
- 是什么:
- 一种可针对数组字面量或函数调用使用的特殊JS语法
- 用途:
- 展开数组的元素
- 是什么:
- 扩展操作符:
四、闭包
- 是什么:
- 一种机制,函数对象与作用域组成起来解析函数变量的机制
- 特点:
- 能访问外部函数的变量
- 能保存某个状态或上下文信息
五、函数属性、方法与构造函数:
- 属性:
- length
- name
- prototype
- 方法:
- 间接调用一个函数的方法:
- 有哪些:
- call(参数1,参数2...)
- apply(参数1,[参数2,参数3...])
- 特点:
- 第一个参数都是要在其上调用这个函数的对象(即函数调用上下文,this的值)
- 注意:
- 箭头函数的this值不能通过这两个方法重写
- 举例说明:
- f.call(o):在o上调用函数f,o为函数f里this的值,f为o的方法
- 有哪些:
- bind():
- 用途:
- 把函数绑定到对象
- 注意:
- 箭头函数的this值不能通bind()方法重写
- 用途:
- toString():
- 用途:
- 返回一个符合函数声明语句的字符串
- 用途:
- 间接调用一个函数的方法:
参考资源: 犀牛书第七版--函数(javascript权威指南)