函数的基本操作
-
核心原理
- 创建函数:堆内存
- 首先在当前作用域声明一个函数名(var sum; function sum ;两个名字是重复的,不能这样声明)
- 浏览器开辟一个新的内存空间(一个16进制的地址),把函数体中的代码当做普通字符串存储在这个内存空间(创建函数不执行,函数没有意义)
- 内存空间的地址赋值给声明的函数名
- 执行函数:栈内存
- 首先,浏览器开辟一个新的 私有作用域
- 形参赋值
- 私有作用域中的变量提升
- 把之前存储的JS代码字符串,拿到私有作用域中,把它们作为JS表达式从下到上执行
- 私有作用域是否销毁的问题
- 闭包:函数执行会形成一个私有的作用域,让里面的私有变量和外界互不影响,可以理解为私有作用域把私有变量保护起来,这种保护机制我们称为闭包
- 堆内存:所有引用数据类型,存储的内容都在堆内存
- 栈内存:作用域,提供JS代码执行的环境。对象会把键值对存储;函数把函数体当做字符串存储起来
- 创建函数:堆内存
-
函数中的形参和实参
- 形参:形参是个变量,用来存储和接收用户执行函数时,传递过来的值
- 实参:执行函数 时传递给形参的具体值
-
arguments实参集合
- 我们不清楚用户要传递几个值的时候,使用函数的内置方法arguments获取实参集合
- arguments是一个类数组集合
- length属性,存储当前传递实参的个数
- callee存储的是当前函数本身
- 现在项目大部分都是基于严格模式的"use strict" ; 严格模式不支持callee和callee.caller(即宿主环境,window下为null)
-
return 函数返回值
-
sum代表的是函数本身,sum()先让函数执行,代表函数返回的结果
-
没有return或者只写了return;,返回undefined
-
函数体中遇到return, return后面的代码就不执行了
-
匿名函数
- 没有名字的函数
-
自执行函数
- 创建完成之后就执行的函数
- ;( function(){} ) () ;