作为程序猿,一定要在没事的时候多出去走走,说不定哪天就偶遇了,不然整天宅,那我们一身的技术怎么跟妹子们展示呢,
哈哈,切入正题,就在我准备偶遇妹子的时候,,却在图书馆偶遇了------
你不知道的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(右) 查询
热门评论
今天看到这本书想深入理解一下,记得以前好像在慕课搜索相关文章的时候看过写的这篇读后感。今天翻出来看看相互印证一下
楼主你没发现一个问题,就是JavaScript的高级程序设计中说fun(a)中的这个a只是一个参考,其实js不会注意这个东西,你传进来几个参数他的arguments都会有,那么编译器到底管没管a这个形式参数呢?
文章写的超级好,生动而幽默,佩服