JavaScript静态作用域解析

静态作用域与动态作用域

因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。
而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。
学过编译原理的同学应该知道这两者的区别

看下列的区别

var value = 1;
function print(){
  console.log(value);
}
function foo(){
  var value = 2;
  print();
}
foo();//1
var value = 1;
function foo(){
  var value = 2;
  function print(){
    console.log(value); 
 }
  print();
}
foo();//2

这就是js的静态作用域所造成的区别,假设js是动态作用域的话,那么两个例子输出就应该都是2啦
在《JavaScript权威指南》中有如下的例子,我们可以看下,顺便巩固对js静态作用域的理解

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采用的是词法作用域,函数的作用域基于函数创建的位置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容