Skip to main content

函数function

函数实际上是对象,每个函数实际上都是Function类型的实例,而且与其他引用类型一样具有属性和方法。函数名实际上是一个指向内存堆中某个函数对象的指针。

一、函数类别

  1. function创建
  2. 函数字面量:函数后function也可以跟函数名,但是没有意义
  3. new一个Function,创建Fcuntion的实例
  4. 自执行函数:没有函数名,只能执行一次;
  5. ES6箭头函数

函数定义时候写在括号里的参数是形参,函数执行时传进去的参数是实参,形参和实参是一一对应的,arguments 实参集合 类数组(元素集合) return 决定函数的返回值 打断函数执行 this 函数的执行主体(非严格模式下,形参和 arguments 有映射关系,但在严格模式下却没有)

二、函数存储

JavaScript中的函数属于引用数据类型,因此,函数存储是开一个 16 进制的堆内存,把函数体内的代码当字符串存进去。

三、函数执行

函数执行是开一个私有作用域(栈内存),把堆内存的代码字符串拿出来执行,先形参赋值,再变量提升,然后代码从上到下执行(执行上下文),函数执行完,变量销毁,作用域销毁。

四、变量提升

在代码执行之前JavaScript会把代码中带的varfunction的提前声明,带var的只声明不定义,带function的声明又定义。变量提升,只提升等号左边的内容,对于条件语句来说,无论条件是否成立,都会进行变量提升,在条件句和循环句中的function是只声明不定义的。

需要注意只有var声明的变量才存在变量提升,letconst声明的都不会。

五、作用域

作用域是代码执行时作用的区域,作用域就是一块栈内存(栈内存是用来存储值类型数据的,还有就是提供代码运行环境)。

六、没有重载

ECMAScript 函数不能像传统意义上那样实现重载,而在其他语言中(Java),可以为一个函数编写两个定义,只要这两个定义的签名(接收参数的类型和数量)不同即可。

ECMAScript 函数没有签名,因为其参数是由包含零个或多个值的数组来表示的。没有函数签名,真正的重载是不可能做到的。在 ECMAScript 中定义两个名字相同的的函数,则该名字只属于后定义的函数。如何实现类似于 Java 中的重载呢,其实可以通过判断传入函数的参数类型和个数来做出不同响应。