JavaScript最容易忽视的小知识
函数定义阶段做的三件事情
1. 开辟一个内存空间
2. 把你写的代码一模一样的放在这个空间中(不解析变量)
3. 把空间地址给到变量名(函数名)
- 预解析只会解析函数体外的内容
- 函数体内的内容会在函数调用的时候进行预解析
函数调用阶段的四个事情
1. 按照函数名内部存储的地址找到对应的函数存储空间
2. 形参赋值
3. 预解析
4. 函数体内的代码执行(才开始解析变量)
预解析(又叫预解释)
- javascript 是一个解释性语言
- 就是在代码执行之前,对代码进行通读,把一些东西提前解析出来
预
+ 是在代码执行之前进行解释
+ 当代码开始执行的时候,表示预解析结束了
解析(一共解析两个东西)
1. 声明式函数 function fn() {}
2. var 关键字
做什么
1. 会把 var 声名的变量提前(在代码执行之前,浏览器就已经知道了内存中有一个变量可以使用了,只不过没有值)
2. 把声明式函数提前
+ 会把函数名当作变量提前
+ 并且告诉浏览器这个变量的值是一个函数地址
预解析的无节操
1. 不管 if 条件是否成立,代码块里面的代码会进行预解析
2. 在函数体内,return 后面的代码虽然不会执行,但是会进行预解析
函数的优点
1. 重复利用
2. 使代码更加简洁
3. 调用时机,在一个我想让他执行的地方随是触发
- 函数定义阶段的 () 用来存放 形参 的
- 函数调用阶段的 () 用来存放 实参 的
- 形参:
就相当于在函数体内定义的一个变量,只能在函数体内使用,函数体外用不了
函数形参的值是什么,取决于函数调用的时候传递的是什么 - 实参:
就是在函数调用的时候,给形参赋值的
- 形参:
作用域
- 就是一个变量可以使用范围
只有函数生成私有作用域
作用域分成两种
- 全局作用域
- 当你的页面打开的时候就会生成
- 私有作用域(局部作用域)
- 每一个函数都是一个私有作用域
- 一旦出现了私有作用域,那么就会分上下级的情况
一个变量的使用范围
-
一个变量只能在自己的作用域内部使用
-
自己的上级作用域不能用
-
自己的下级作用域可以使用
window 作用域 下级 fn 私有作用域 window 的变量在 fn 私有作用域里面可以使用 fn 私有作用域的变量在 window 上不能用 作用域和函数的调用没有关系 只看函数的定义 函数定义在什么位置,就决定了他的作用域在哪
访问规则
就是当我向使用一个变量的时候的规则
当你在使用一个变量的时候,
会先在自己本身的作用域里面进行查找,如果有就使用,停止查找
如果没有,那么会去上一级作用域里面查找,如果有就使用,停止查找
如果没有,那么就再去上一级作用域里面查找,如果有就使用,停止查找
如果没有,就再上一级,直到全局作用域都没有这个变量,就报错
变量 is not defined