函数和时间的结合
- 常见的事件
- 鼠标事件
- 键盘事件
- 表单事件
- 浏览器事件
- onload 所有页面加载完毕后触发
- onresize 当浏览器窗口大小改变的时候触发
- onscroll 当浏览器滚动条滚动的时候触发
预解析
-
是在所有的代码执行执行之前进行通读并解释
- var 关键字声明的变量提前
就是告诉浏览器变量名可以使用,但是没有赋值 - 声明式函数提前
就是告诉浏览器函数名(变量名)可以使用,并且这个变量名的值是一个函数地址
- var 关键字声明的变量提前
-
预解析
- 不管 if 条件是否成立,代码块里面的代码会进行预解析
- return 后面的代码虽然不执行,但是会进行预解析
函数定义阶段做的事
- 开辟一个存储空间
- 把代码存到存储空间中(不解析变量)
- 把存储空间的地址赋给变量名(函数名)
函数调用阶段做的事
- 按照函数名存储的地址找到对应的存储空间
- 形参赋值
- 预解析
- 把存储空间内的代码拿出来执行(解析变量)
作用域
-
变量的使用范围
-
只有函数可以生成私有作用域
-
作用域分为两种
- 每一个打开的页面都是一个私有作用域
- 每一个函数都是一个私有作用域
-
作用域对变量的限制
- 一个变量只能在自己的作用域里面使用
- 或者在下级作用域里面使用
- 不能在上级作用域里面使用
- 作用域和函数的调用没有关系,在函数定义的时候已经确定好了
-
作用域的访问规则
- 自己有就用自己的
- 自己没有就去上一级查找
- 如果还没有就再去上一级查找
- 知道查到 window 上都没有,那么就报错(变量 is not defined)
-
作用域的赋值规则
- 自己有就给自己的赋值
- 自己没有就给上一级的赋值
- 上一级还没有就给再上一级的赋值
- 直到 window 上都没有,那么就把这个变量定义为全局变量再赋值
递归函数
-
一个函数自己调用自己
-
把一段业务逻辑分成若干个一摸一样的逻辑来执行
-
写递归函数的时候
- 当最后一个函数没有执行完毕之前,前面的函数一直在等待,会占用额外的内存空间
- 写递归的时候先写停的条件
数据在内存中的存储
- 基本数据类型 直接存储在栈里面
- 复杂数据类型,数据存储在堆里面,栈里面只存储了一个地址(引用)
变量的赋值关系
- 基本数据类型,赋值之后两个变量没有关系了
- 复杂数据类型,赋值之后两个变量指向同一个数据空间,所以操作的是一个位置
数据类型之间的比较
- 基本数据类型是直接比较值
- 引用数据类型是比较的 地址
函数的赋值操作
- 和变量的赋值规则是一样的
- 当实参传递的是基本数据类型的时候,函数内部的形参和函数外部的变量没有关系
- 当实参传递的是复杂数据类型的时候,函数内部的形参和函数外部的变量操作的是同一个对象空间