1. 前端的基本要素(演员们)
引擎,作用域,编译器
var a = 2
编译器在编译时处理一个,引擎在运行时处理一个
引擎,作用域,编译器三者交互图:
编译器在编译过程中的第二步生成了代码,引擎执行它时,会通过查找变量 a 来判断它是否已经声明过。查找过程有作用域协助,但引擎执行怎样的查找,会影响最终查找的结果。
2. LHS和RHS
核心思想:LHS:找到容器的本身,从而对其赋值; RHS: 取得某变量的原值,或者是,得到某某的值
例子:
function foo(a){
console.log(a)
}
foo(2)
//此处发生了两处RHS查询,一处LHS查询
3. 作用域之间的嵌套
当一个块或者或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套,因此在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量,或抵达最外层的作用域(也就是全局作用域)为止。
遍历嵌套作用域链的规则很简单:引擎从当前的执行作用域开始查找变量,如果找不到,就会向上一级继续查找,当抵达全局作用域时,无论是找到还是没找到,查找过程都会停止
4. 可能会造成的异常
严格模式:禁止自动或者隐式的创建全局变量
非严格模式:1. 当引擎做LHS查找到全局作用域时还是找不到此变量,则会创建一个具有该名称的全局变量;2. 但如果引擎在进行RHS查找时,查找到全局作用域都没有找到此变量,则会抛出ReferenceError异常
ReferenceError: RHS查询找不到
TypeError: 引擎找到了这个变量,这个变量是一个数字类型,但是你要对它进行函数调用,此处会出现TypeError异常(作用域判断成功,但操作不合理或非法)
- 写博客的理由是希望获得坚持学习的勇气,希望能一直坚持下去
- 能为其他小伙伴提供便利
- 如果文章涉及侵权或者其他,请评论或者留言指出删除此文章
- 文章中出现的一些见解是我自己认为重要的部分,欢迎讨论交流,互相努力
- 有前端的小伙伴有一起学习的愿望,可以添加qq2454459210