JS之静态(词法)作用域

1,786 阅读1分钟

感谢讶羽大大的分享,想看原文移步讶羽大大的GitHub

静态作用域

JavaScript使用的是词法作用域,也就是静态作用域。

也有说使用了动态作用域的

例子:


      var value = 1;
      function foo() {
        console.log(value);
      }
      function bar() {
        var value = 2;
        foo();
      }
      bar();//1 因为是JS采用的是静态作用域

记住一点:JavaScript的作用域是在定义的时候就确定了。

所以这个例子中,我们去找value,先在foo里找,没有,再按字面,从其作用域链向上,也就是foo()外面找,value = 1

再来看看作用域链

此例子中有三个作用域。全局作用域以及下面两个平级的:foobar。所以当我们在foo找不到value的时候,就只能在全局去找,而不是在bar去找。

关于闭包

这个例子中bar()应该就不是一个闭包,为什么呢?

因为他里面的foo并没有引用bar作用域里的任何变量,所以保存不了任何东西,于是会被垃圾回收。

思考题

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

这就是一个闭包,试着分析一下即可。