你不知道的JavaScript之理解作用域(2)

在上一篇博客https://blog.csdn.net/qq_37216615/article/details/80891480 中介绍了什么是LHS和RHS,你可能会疑惑知道他两有什么用呢?

结合对LHS和RHS的理解,考虑如下代码:

function(a){

    console.log(a+b);

    b=a;

}

foo(2);

在执行log(a+b)时,引擎会对a和b分别做一次RHS查询,作用域找得到a但是找不到b,因为编译器没有进行b的声明,所以说引擎也获取不到b的值,于是引擎就会抛出异常:ReferenceError。

下面来看LHS查询:当引擎做LHS查询时,如果在全局作用域中也无法找到变量,全局作用域就会创建一个具有该名称的变量,并交给引擎,但前提是程序运行在宽松模式下。也就是说这个变量之前并不存在,但是作用域热心的为引擎创建了一个,所以说LHS查询其实是失败的,只不过全局作用域帮着解决了。

但是在严格模式下是禁止自动或隐式的创建全局变量的,因此严格模式下LHS查询失败时,全局作用域也没辙,引擎只能抛出异常

function f(){

    'use strict';

    a = 5;

}

f()   //ReferenceError:a is not defined

接下来看另外一种情况:如果RHS查询到了一个变量,但是你对这个变量进行了不合理的操作,比如对一个非函数类型进行函数调用,那么就会抛出另外一个异常TypeError

总结:作用域判别失败导致ReferenceError,作用于判别成功但是操作非法会导致TypeError

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值