你不知道的js上阅读感1-1

1. 前端的基本要素(演员们)

引擎,作用域,编译器

var a = 2
编译器在编译时处理一个,引擎在运行时处理一个

引擎,作用域,编译器三者交互图:

Created with Raphaël 2.1.2 编译器 编译器 作用域 作用域 引擎 引擎 是否存在一个变量名称a 存在a 这个名称在我这儿呢,哥们继续。 不存在a 这个a没有啊,没关系,我帮你声明一个。 好了,大功告成 兄弟,这是我帮你生成的运行时代码,拿走吧 有任务,让我看看做些啥事? 原来是让我处理 a=2 这个赋值操作啊,没问题 兄弟,你有看见 a 这个变量不? 存在 a 看见了,编译器才让我声明过,就是这个,拿走吧 这不就完成了么,小菜一碟 不存在 a 没瞅见啊,这是个啥? 那行吧,我再找找看 a 到底在哪里啊? 找到了 a 行啦,终于完成了 始终没找到 a MMP,到底藏哪去了,算了不找了,气死我了,把异常扔出去算了

编译器在编译过程中的第二步生成了代码,引擎执行它时,会通过查找变量 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异常(作用域判断成功,但操作不合理或非法)


  1. 写博客的理由是希望获得坚持学习的勇气,希望能一直坚持下去
  2. 能为其他小伙伴提供便利
  3. 如果文章涉及侵权或者其他,请评论或者留言指出删除此文章
  4. 文章中出现的一些见解是我自己认为重要的部分,欢迎讨论交流,互相努力
  5. 有前端的小伙伴有一起学习的愿望,可以添加qq2454459210

猜你喜欢

转载自blog.csdn.net/qq_34567015/article/details/82145317
今日推荐