• JS作用域相关知识(#精)


    在学习《你不知道的JS》一书中,特将作用域相关知识在此分享一下:

    #说到作用域,就不得不提到LHS查询和RHS查询:

    1)如果查询目的是对变量进行赋值,则使用LHS查询

    2)如果查询目的是获取变量的值,则使用RHS查询

    作用域的查询都会从当前执行的作用域开始查找,如果没有找到所需要的标识符,就会向上级作用域继续查找,直到抵达全局作用域为止

    # 当进行RHS查询时无法找到该变量,引擎则会抛出ReferenceError的异常

    代码示例如下:

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

    在此代码示例中未声明b变量,因此RHS查询时无法找到它,则抛出ReferenceError异常

    #当RHS查询时找到了变量,但试图对一个非函数类型的值进行函数调用,或者引用null或undefined类型的值中的属性,则引擎会抛出另一种异常:TypeError

    在作用域查找中还有非常重要的一点: "遮蔽效应"

    作用域查找会在找到第一个匹配的标识符时停止,在多层嵌套作用域中可以定义同名的标识符,叫做'遮蔽效应'

    代码示例如下:

            var b = 4;
            function foo(a){
                var b = 3;
                console.log(a+b);
    
            }
            foo(2);//5

    这里由于作用域查找中具有遮蔽效应,引擎会先找到执行作用域中的 var b = 3,将执行作用域名之外的 var b = 4遮蔽,因此即便外面也用的是相同的变量b作为标识符,也并不影响函数的执行

    那么如何来访问那些被同名变量所遮蔽的全局变量呢,在这里,我们可以引入window.a的技术;

    注意:通过这种技术可以访问那些被遮蔽的全局变量,但非全局的变量被遮蔽则无论如何都无法被访问

  • 相关阅读:
    Balance的数学思想构造辅助函数
    1663. Smallest String With A Given Numeric Value (M)
    1680. Concatenation of Consecutive Binary Numbers (M)
    1631. Path With Minimum Effort (M)
    1437. Check If All 1's Are at Least Length K Places Away (E)
    1329. Sort the Matrix Diagonally (M)
    1657. Determine if Two Strings Are Close (M)
    1673. Find the Most Competitive Subsequence (M)
    1641. Count Sorted Vowel Strings (M)
    1679. Max Number of K-Sum Pairs (M)
  • 原文地址:https://www.cnblogs.com/wccc/p/6698747.html
Copyright © 2020-2023  润新知