为了账号安全,请及时绑定邮箱和手机立即绑定

你不知道的javascript---初识作用域

标签:
JavaScript

作为程序猿,一定要在没事的时候多出去走走,说不定哪天就偶遇了,不然整天宅,那我们一身的技术怎么跟妹子们展示呢,
哈哈,切入正题,就在我准备偶遇妹子的时候,,却在图书馆偶遇了------

你不知道的javascript,作者:Kyle Simpson
下面是我的一些笔记,希望和大家交流,,(如果有错误希望大家提出);


作用域是什么

在程序中我们需要一套规则来储存变量,并且之后可以方便的找到这些
变量,否则程序容易乱套,这套规则就是作用域
再通俗点来说就是不同地方的变量,函数都有自己的使用范围

一个例子

var a=1; //编译器会如何处理这个变量的声明

1)首先编译器会处理 var a ,编译器会首先询问作用域是否已存在变量 a ,如 果存在,就会忽略var a ,如果不存在,编译器会要求作用域在当前作用域声明新变量 a.然后编译器会为引擎生成运行时所需的代码(注意:变量的声明与赋值不是在同一阶段)

2)引擎运行时,会处理 a=2 赋值操作,引擎首先询问作用域有没有变量 a ,如果有则使用,如果没有,引擎会向上寻找(一直找到最后)

以上总结:编译器---作用域---引擎

LHS查询 和 RHS查询

LHS查询:就是试图找到变量的本身,从而可以对他赋值(例如:赋值操作的左边)

RHS查询:就是很好理解,我们要找到这个值就可以了

a=2;
console.log(b);
其中对 a 的引用是LHS引用(我们试图找到 a ,然后把 2 给他)
其中对 b 的引用是RHS应用(我们就是要找到 b 这个值) 

书中的一个非常形象的LHS和RHS引用的例子

图片描述

作用域嵌套

function foo(a){
    console.log(a+b);
}
var b=3;

foo(2);     // 5

其中对 b 进行RHS引用函数内部无法完成,但可以在上一级的作用域完成

注:在当前的作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域
    中继续查找,直到找到该变量,或抵达最外层的作用域为止;

异常

为什么区分LHS 和 RHS

function foo(a){
    console.log(a+b);
    b=a;
}

foo(2)

执行函数,首先对 b 进行 RHS查询,因为从没有声明 b 这个变量,所以在任何相关的作用域中都无法找到 b 这时引擎就会抛出 ReferenceError,,

但是执行 b=a 时,,引擎对 b 执行LHS查询,如果在所有相关的作用域中都没有找到 b 的话,,那么在全局作用域中就会很热情的给我们创建一ge b 变量(注意:在非‘严格模式’下才会自动创建,‘严格模式’下禁止自动或隐式的创建全局变量,同样会抛出ReferenceError)

当执行RHS查询时,当不恰当的对变量的值进行操作时,(例如:试图对一个非函数类型的值进行函数调用时,引擎会抛出TypeError)

ReferenceError 同作用域的判别失败有关
TypeError 代表作用域判别成功,但是对结果的操作是非法的,不合理的

总结:作用域是一套规则,用于确定在何处以及如何查找变量(标识符),
     然后是LHS(左) 和RHS(右) 查询
点击查看更多内容
10人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消