函数function
函数实际上是对象,每个函数实际上都是Function
类型的实例,而且与其他引用类型一样具有属性和方法。函数名实际上是一个指向内存堆中某个函数对象的指针。
一、函数类别
function
创建- 函数字面量:函数后
function
也可以跟函数名,但是没有意义 new
一个Function
,创建Fcuntion
的实例- 自执行函数:没有函数名,只能执行一次;
ES6
箭头函数
函数定义时候写在括号里的参数是形参,函数执行时传进去的参数是实参,形参和实参是一一对应的,arguments 实参集合 类数组(元素集合) return 决定函数的返回值 打断函数执行 this 函数的执行主体(非严格模式下,形参和 arguments 有映射关系,但在严格模式下却没有)
二、函数存储
JavaScript
中的函数属于引用数据类型,因此,函数存储是开一个 16 进制的堆内存,把函数体内的代码当字符串存进去。
三、函数执行
函数执行是开一个私有作用域(栈内存),把堆内存的代码字符串拿出来执行,先形参赋值,再变量提升,然后代码从上到下执行(执行上下文),函数执行完,变量销毁,作用域销毁。
四、变量提升
在代码执行之前JavaScript
会把代码中带的var
和function
的提前声明,带var
的只声明不定义,带function
的声明又定义。变量提升,只提升等号左边的内容,对于条件语句来说,无论条件是否成立,都会进行变量提升,在条件句和循环句中的function
是只声明不定义的。
需要注意只有var
声明的变量才存在变量提升,let
和const
声明的都不会。
五、作用域
作用域是代码执行时作用的区域,作用域就是一块栈内存(栈内存是用来存储值类型数据的,还有就是提供代码运行环境)。
六、没有重载
ECMAScript 函数不能像传统意义上那样实现重载,而在其他语言中(Java
),可以为一个函数编写两个定义,只要这两个定义的签名(接收参数的类型和数量)不同即可。
ECMAScript 函数没有签名,因为其参数是由包含零个或多个值的数组来表示的。没有函数签名,真正的重载是不可能做到的。在 ECMAScript 中定义两个名字相同的的函数,则该名字只属于后定义的函数。如何实现类似于 Java 中的重载呢,其实可以通过判断传入函数的参数类型和个数来做出不同响应。