作用域

作者: LenHong | 来源:发表于2020-03-31 14:59 被阅读0次

    静态作用域 (词法作用域) 和 动态作用域

    下面的例子可以帮助理解

    var value = 1;
    function foo() {
        console.log(value);
    }
    function bar() {
        var value = 2;
        foo();
    }
    bar();
    
    1. 假设 JavaScript 采用 静态作用域,函数执行如下
      执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。
    2. 假设 JavaScript 采用 动态作用域,函数执行如下
      执行 foo 函数,依然是从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。
    3. 因为 JavaScrip 使用的是静态作用域,所以结果会打印 1

    下面两个例子可以更好的理解 JavaScrip 的作用域

    var scope = "global scope";
    function checkscope(){
        var scope = "local scope";
        function f(){
            return scope;
        }
        return f();
    }
    checkscope();
    
    var scope = "global scope";
    function checkscope(){
        var scope = "local scope";
        function f(){
            return scope;
        }
        return f;
    }
    checkscope()();
    

    结果是两段代码都会打印:local scope

    这是因为 JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。

    简单的说,因为JavaScript采用的是词法作用域,函数的作用域基于函数创建的位置。

    参考:https://github.com/mqyqingfeng/Blog/issues/3

    相关文章

      网友评论

          本文标题:作用域

          本文链接:https://www.haomeiwen.com/subject/mlvxuqtx.html