继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

王小仙
关注TA
已关注
手记 3
粉丝 19
获赞 127

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

你不知道的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(右) 查询
打开App,阅读手记
10人推荐
发表评论
随时随地看视频慕课网APP

热门评论

今天看到这本书想深入理解一下,记得以前好像在慕课搜索相关文章的时候看过写的这篇读后感。今天翻出来看看相互印证一下

楼主你没发现一个问题,就是JavaScript的高级程序设计中说fun(a)中的这个a只是一个参考,其实js不会注意这个东西,你传进来几个参数他的arguments都会有,那么编译器到底管没管a这个形式参数呢?

文章写的超级好,生动而幽默,佩服

查看全部评论