亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

你不知道的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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消