你不知道的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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值