函数和时间的结合 + 预解析 + 函数定义和调用阶段做的事 + 递归函数

函数和时间的结合

  • 常见的事件
    • 鼠标事件
    • 键盘事件
    • 表单事件
    • 浏览器事件
      • onload 所有页面加载完毕后触发
      • onresize 当浏览器窗口大小改变的时候触发
      • onscroll 当浏览器滚动条滚动的时候触发

预解析

  • 是在所有的代码执行执行之前进行通读并解释

    1. var 关键字声明的变量提前
      就是告诉浏览器变量名可以使用,但是没有赋值
    2. 声明式函数提前
      就是告诉浏览器函数名(变量名)可以使用,并且这个变量名的值是一个函数地址
  • 预解析

    1. 不管 if 条件是否成立,代码块里面的代码会进行预解析
    2. return 后面的代码虽然不执行,但是会进行预解析

函数定义阶段做的事

  1. 开辟一个存储空间
  2. 把代码存到存储空间中(不解析变量)
  3. 把存储空间的地址赋给变量名(函数名)

函数调用阶段做的事

  1. 按照函数名存储的地址找到对应的存储空间
  2. 形参赋值
  3. 预解析
  4. 把存储空间内的代码拿出来执行(解析变量)

作用域

  • 变量的使用范围

  • 只有函数可以生成私有作用域

  • 作用域分为两种

    • 每一个打开的页面都是一个私有作用域
    • 每一个函数都是一个私有作用域
  • 作用域对变量的限制

    • 一个变量只能在自己的作用域里面使用
    • 或者在下级作用域里面使用
    • 不能在上级作用域里面使用
    • 作用域和函数的调用没有关系,在函数定义的时候已经确定好了
  • 作用域的访问规则

    • 自己有就用自己的
    • 自己没有就去上一级查找
    • 如果还没有就再去上一级查找
    • 知道查到 window 上都没有,那么就报错(变量 is not defined)
  • 作用域的赋值规则

    • 自己有就给自己的赋值
    • 自己没有就给上一级的赋值
    • 上一级还没有就给再上一级的赋值
    • 直到 window 上都没有,那么就把这个变量定义为全局变量再赋值

递归函数

  • 一个函数自己调用自己

  • 把一段业务逻辑分成若干个一摸一样的逻辑来执行

  • 写递归函数的时候

    • 当最后一个函数没有执行完毕之前,前面的函数一直在等待,会占用额外的内存空间
    • 写递归的时候先写停的条件

数据在内存中的存储

  • 基本数据类型 直接存储在栈里面
  • 复杂数据类型,数据存储在堆里面,栈里面只存储了一个地址(引用)

变量的赋值关系

  • 基本数据类型,赋值之后两个变量没有关系了
  • 复杂数据类型,赋值之后两个变量指向同一个数据空间,所以操作的是一个位置

数据类型之间的比较

  • 基本数据类型是直接比较值
  • 引用数据类型是比较的 地址

函数的赋值操作

  • 和变量的赋值规则是一样的
  • 当实参传递的是基本数据类型的时候,函数内部的形参和函数外部的变量没有关系
  • 当实参传递的是复杂数据类型的时候,函数内部的形参和函数外部的变量操作的是同一个对象空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值