JavaScript的作用域

JavaScript的编译

通常来说JavaScript是一门“动态”或者“解释执行”语言,但事实上它是一门编译语言,晦涩的编译原理咱就不说了(我也不懂),直接说一下JavaScript的编译情况。对于JavaScript来说,大部分情况下编译发生在代码执行前几微秒的时间内。
最简单的一段JavaScript的代码:

    var a = 2;

编译器对于这行代码会进行两个步骤的处理:

    //变量声明    var a;    //赋值操作    a = 2;

这个过程中会涉及到变量提升的问题。

  1. 编译器遇到var a,会检查当前的作用域中是否有a的声明。如果有,那么就会忽略掉a的声明,如果没有就会在当前的作用域中声明一个新的变量,并命名为a。

  2. 接下来编译器就把a = 2这条语句翻译成机器代码等待运行。引擎运行时会查找当前的作用域中是否有一个名字为a的变量。如果有就使用;如果没有,引擎会到上层的作用域中查找,直到全局作用域中。

区分RHS和LHS

    var a = 2; //这里是一个LHS引用    console.log(a); //这里是一个RHS引用

乍一看LHS就是‘=’的左边,RHS就是‘=’的右边。但我对LHS的理解是我把值放到哪里,RHS是我去哪里找我要的值。为什么要区分RHS和LHS,因为在变量还没有声明的时候,这两种查询的行为是不一样的。

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

运行时,第一次对b进行的是RHS的查询,引擎在所有作用域中都找不到,最后会抛出一个ReferenceError的错误。而对于b=a而言,b进行的是LHS查询,如果在全局作用域中都找不到,那么就会在全局作用域中创建一个变量b。(前提是代码运行在非严格模式)。
接下来,如果RHS查询到了一个变量,但你尝试对这个变量的值进行不合理的操作。比如,对一个非函数类型的值进行函数调用,那么引擎会抛出TypeError。
ReferenceError与作用域判别失败相关,TypeError则代表了作用域判别成功,但对结果的操作是非法或不合理的。

关键字:JavaScript, rhs, 变量, lhs

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部