function 函数名 (参数1,参数2,...){
语句块}
参数可以理解为变量名,参数的值可以理解为变量的值
这种写法,叫命名函数
匿名函数
var 函数名
第三种:
函数的第一个作用:执行函数就会执行语句块,多次执行,可以减少代码的重复.
函数的第二个作用:
函数的第三个作用:封装性,通过传参,让函数根据参数的不同,完成不同的结果,多态性,参数不同可以有不同的结果.
命名函数具有预解析,预赋值,
明明函数定义在任何位置都不重要,可以理解成当前script刚开始的时候,命名函数已经定义完成了
命名函数最大的特点是预解析,预赋值,在script最开始的地方
重复开辟相同空间,第二个不起作用
变量定义只做预解析,不做预赋值.匿名函数当运行的匿名函数之后才能调用,在匿名函数之前只有预解析,没有预赋值,
匿名函数命名:
getsum的起名属于二次命名.
第三种函数.
这属于自执行匿名函数,无法第二次调用,只能执行一次.
在前面使用+ - ! ~都是自执行函数.
3.构建函数创建函数
优势:
反射:将字符串反射为js代码运行.
函数执行顺序
函数具有多次可执行的特点:
入口函数:
函数的参数
获取函数的形参和实参的数量
函数的参数有4种情况:
1.必填参数
2.初始值参数,默认值参数
3.可选参数
4.剩余参数
获取
实参多出来了的时候.
剩余参数和arguments是不同的类型
不能混为一谈
函数的伧俗乐行要严格按照顺序定义
区别,剩余参数arg heargiument
局部变量:
函数内部如果继续定义变量,也叫局部变量,因为不能在函数外部调用
函数内部定义的变量优先级高于形参,覆盖参数传入形参
js是一个弱类型语言,意味着函数中的参数,无法限制,传入实参的数据类型,这有可能因为传入参数的类型,不符合运行的特征造成函数的错误.
这时候,我们尽量在函数中判断函数的数据类型,或者进行数据类型的转换,以保证我的的函数运行后,达到预期。
自己限定传入参数,并有错误提醒
错误的类型
使用时该值不存在就是引用错误.
一旦抛出错误,后面的内容不能执行,
只能在函数内部使用,该函数后面的内容不能执行
函数的作用与
函数外的变量,函数内可以调用,函数内定义的变量,函数外无法调用.
函数的变量,是有作用范围的,可以推测,任何变量都有作用欲
每一个函数是一个作用域,父级作用域定义的变量,自己可以可以调用;
但是自己定义的变量,不能在父级中调用
作用域以函数来划分,一个函数就是一个作用域
函数内使用var定义的变量,会在执行函数开始做预解析,函数该开始时,就被分配了空间
当函数执行完成后,就会立即销毁子级作用域中的栈中的数据(闭包除外)
如果父级作用域与子级作用域中的变量同名时,无法调用父级,只能调用子级
修改全局变量
函数中,局部变量,在函数中,使用var定义的变量就是局域变量,let定义局部变量,const定义局部常量,
不能覆盖
参数是可以覆盖匿名函数命名的
匿名函数命名可以被函数中使用var的局部变量覆盖.
1.如果在这个匿名函数中,直接给匿名函数命名,重新赋值,是无效的.
2.如果在这个匿名函数中设置参数的名与匿名函数的命名相同,将会覆盖匿名函数的命名
3.如果在这个匿名函数中设置的var定义局部变量名与匿名函数命名相同,将会覆盖匿名函数命名
4.函数中的命名函数也是局部变量
匿名函数的命名被覆盖:
全局变量和局部变量有什么用处
纯函数
概念:执行函数后,不会对函数外的任何变量造成影响,或者影响其他的全局内容,
全局变量的特征:长期留存的特征.
纯函数
函数之外的作用域
const定义的常量也在与一块中
在同一个作用域中,let不能定义两个相同的变量.
当函数中,使用let定义了局部变量,那么当前函数匿名函数的命名,就无法使用
在函数中,如果使用了let,意味着匿名函数的命名,参数,局部变量,局部函数的的名称都不能相同.
当把函数定义在语句块中,那么函数就会在语句块开始的时候做域解析域赋值
面试题,蒙的1