是对象,是一个引用数据类型
1.函数的本质
首先我们知道函数是引用类型数据,使用函数是为了提高代码的复用性
从本质上讲,函数是一种特殊对象(数组也是一种特殊的对象),函数内部数据私有。
👇这部分关于原型的问题先不细说,总之理解函数的本质是对象即可。
prototype:每个函数都有一个
prototype
属性,默认指向一个空对象(原型对象)给原型对象添加属性(一般添加方法)作用:函数的所有实例对象自动拥有原型中的属性(方法)
__proto__: 每个实例对象都有一个
__proto__
属性,该属性指向当前实例对象的原型对象(隐式原型对象)
//默认情况下,一个函数对应两块内存,一块是函数本身,一块是函数原型。一个函数都会与一个原型函数与之对应,函数中有个指针prototype指向原型对象,原型对象中有个constructor指向函数,你中有我,我中有你。
function foo(){}
foo.prototype.constructor===foo; //true
console.log(foo.prototype); //空对象,即原型对象
👇 函数内存图解:
👇 原型继承图解
紫色画笔部分
2.函数分类
本质上是完全一样的,唯一的区别在于调用方式。
- 普通函数【方法】
- 构造函数【类-在面向对象中学习】(为了区分将构造函数的函数名大写)
3.函数定义
函数存在变量提升,但需要注意两种方式下变量提升的区别(匿名函数不会被提升)
方式一--函数声明写法
function 函数名(形参){}
//-------------------------------------
function add(int a,int b){} //❌
function add(a,b){} //✅
//-------------------------------------
let result=add(1,2);
function add(a,b){
return a+b
} //✅
//由于存在变量的提升,整个函数都被提升