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

版权声明:转载请注明出处,欢迎交流哦! https://blog.csdn.net/zdhui_fly/article/details/80945035

在上一篇博客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

猜你喜欢

转载自blog.csdn.net/zdhui_fly/article/details/80945035