美文网首页
JavaScript 之 静态作用域与动态作用域

JavaScript 之 静态作用域与动态作用域

作者: _一九九一_ | 来源:发表于2019-11-07 14:25 被阅读0次

    静态作用域

    • JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。
    • 函数的作用域在函数定义的时候就决定了

    例子:

    静态作用域:

    执行 foo 函数,先从 foo 函数内部查找是否有局部变量 value,如果没有,就根据书写的位置,查找上面一层的代码,也就是 value 等于 1,所以结果会打印 1。

    动态作用域:

    执行 foo 函数,依从 foo 函数内部查找是否有局部变量 value。如果没有,就从调用函数的作用域,也就是 bar 函数内部查找 value 变量,所以结果会打印 2。

    • JavaScript采用的是静态作用域,所以这个例子的结果是 1。
    var value = 1;
    
    function foo() {
        console.log(value);
    }
    
    function bar() {
        var value = 2;
        foo();
    }
    
    bar();      // 1
    

    例子:

    • JavaScript采用的是词法作用域,函数的作用域基于函数创建的位置。都输出local scope
    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()();
    
    • 区别:执行上下文栈的变化不一样
      让我们模拟第一段代码:
    ECStack.push(<checkscope> functionContext);
    ECStack.push(<f> functionContext);
    ECStack.pop();
    ECStack.pop();
    
    

    让我们模拟第二段代码:

    ECStack.push(<checkscope> functionContext);
    ECStack.pop();
    ECStack.push(<f> functionContext);
    ECStack.pop();
    

    相关文章

      网友评论

          本文标题:JavaScript 之 静态作用域与动态作用域

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