当前位置: 首页 > Web前端 > vue.js

适用范围(一)

时间:2023-03-31 22:05:47 vue.js

这段时间,小编看了两本js经典书籍,一本是《深入理解JavaScript》,一本是《你不知道的JavaScript》。中间有些内容完全没看懂。这次决定再读一遍,把书中的内容分享给大家。期待与您共同进步。1.RHS和LHS首先看一个js中很常用的赋值语句vara=2;在这个例子中,js的引擎会对变量a进行LHS查询,当然对应的是RHS查询。那么LHS和RHS到底是什么?简单来说,如果你给一个变量赋值,你就进行了一次LHS。要获取变量的值,需要执行RHS。更准确的说,RHS查询是超过一个变量的值。LHS查询试图找到变量容器本身,然后为其赋值。考虑以下代码:console.log(a);这段代码是对a的RHS引用,因为这里只是查询和获取a的值,并没有赋值。然后将得到的值传给console.log,经过比较,下面的代码是对a的LHS引用,因为我们不关心a当前的值是多少,直接把2赋值给变量avara=2;理解了RHS和LHS,让我们看一个相对复杂的例子。functionfoo(a){console.log(a)//RHS}foo(2).//LHS2.作用域嵌套我们知道,作用域是一组通过名称查找变量的规则。但在实际情况中,往往需要同时估计多个范围。当一个块或函数嵌套在另一个块或函数中时,就会发生作用域嵌套。因此,当在当前作用域中找不到变量时,引擎会继续在变化作用域的外层嵌套作用域中搜索,直到找到该变量或到达最外层作用域(全局作用域)。考虑以下代码functionfoo(a){console.log(a+b);}varb=3;foo(2);//5这段代码中,对于函数foo,只接收一个参数a,对于变量b,在函数作用域内没有找到定义,所以引擎会继续在外层作用域中查找,正好,in全局范围,找到varb=3;然后将两个数字相加并输出。为了更形象,可以把示波器想象成一座高楼。将在当前楼层搜索LHS和RHS参考资料。如果没有找到,他们将乘电梯到下一层。如果还没有找到,就继续往上走,以此类推。.一旦到达顶层(全局范围),您可能找到也可能找不到所需的变量,但搜索过程无论如何都会停止。(我理解这就是传说中的作用域链)如果在全局作用域中没有找到定义,就会抛出异常。对于不同的情况,抛出的异常也会不同,考虑下面的代码。函数foo(a){console.log(a+b);b=a;}foo(2);第一次对b进行RHS查询时找不到该变量。也就是说,它是一个“未声明的”变量,因为在任何相关范围内都找不到它。包括全局作用域,找不到这个变量。如果RHS查询无法在所有嵌套范围内找到所需的变量,引擎将抛出ReferenceError异常。值得注意的是,ReferenceError是一个非常重要的异常类型。相反,当引擎执行LHS查询时,如果在顶级(全局范围)中找不到目标变量,则在全局范围中创建一个具有该名称的变量并返回给引擎,前提是程序不是在“严格模式”下运行。如果RHS查询找到了一个变量,但是你试图对变量的值做一些不合理的事情,比如试图对一个非函数类型的值进行函数调用,或者对一个null类型的值引用属性orundefined,那么引擎会抛出另一种类型的异常,称为TypeError。ReferenceError与范围判别失败有关,而TypeError是指范围判别成功,但对结果的操作不合法或不合理。由于小编是第一次深入研究JavaScript,在公众号过程中难免有失误或误会。如果你发现了,请指出。小编愿在js的道路上与大家一起进步。参考资料:《你不知道的JavaScript(上)》