JS 作用域

理解作用域要先理解执行上下文

先上一段代码

var x=10;
bar();
function foo(){
  console.log(x);
}
function bar(){
  var x=30;
foo()
}
  • 上面的函数输出:10;
  • 按你的理解应该是输出30的,但为什么会是10呢?解析一下为什么输出10,而不是30 :
这里就要说执行上下文了
当 运行JS的时候,会创建全局上下文:globalCotext
语句运行到var x=10;
AO:当前上下文
globalContext={
  AO:{
    x:10;
    foo:function
    bar:function
  },
Scope:null
}
当运行到bar(),进入bar的执行上下文
barContext={
  AO:{
      X:30
    },
  Scope:globalContext.AO
}
运行foo(),进入foo的执行上下文
fooContext={
  AO:{
    },
  Scope:globalContext.AO
}
当在当前上下文没有找到X时,就有去Scope的上下文中找
所以foo的执行上下文X=10;

这里说明一下,不是执行到的时候才创建执行上下文的,JS有声明前置;也就是说一开始就会把上下文给创建好;

在举个栗子:

var x=20;
bar()//输出什么
function bar(){
  var x=30;
function foo(){
  console.log(x);
}
foo();
}
1.
globalContext={
  AO:{
      x:10
      bar:function
  }
Scope:null;
}
bar.[[Scope]]=globalContext.AO
2.
barContext ={
  AO:{
    X:30;
  foo:function; 
}
Scope:bar.[[Scope]]=globalContext.AO
}
foo.[[Scope]]=barContext.AO
3.
fooContext={
  AO:{},
  Scope:foo.[[Scope]]=barContext.AO
}
输出:30

再举个栗子:

var a=1;
function fn(){
    console.log(a);
    var a=5;
    console.log(a);
    a++;
    var a;
    fn3();
    fn2();
    console.log(a);
    
    function fn2(){
        console.log(a);
        a=20;
    }
}

function fn3(){
    console.log(a);
    a=200;
}
fn();
console.log(a);

globarContext={
    AO:{
        a:1;
        fn:function;
        fn3:function;
    }
    Scope:null
}
fn.[[Scope]]=globarContext
fn3.[[Scope]]=globarContext

fnrContext={
    AO:{
        a:5;
        fn2:function;
    }
    Scope:fn.[[Scope]]=globarContext
}

fn3rContext={
    AO:{
        a:undefined;
    }
    Scope:fn3.[[Scope]]=globarContext
}

根据具体情况赋值;
undefined,5,1,6,20,200
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 什么是作用域 对变量值的存储、访问、修改带给程序状态的改变编程语言的基本功能之一是能够存储变量当中的值,在之后对这...
    JunChow520阅读 3,846评论 0 7
  • 前天被问到作用域链的知识,感觉有个大概的认识,但是转化为语言就无法调理清楚地讲述出来,回来后决定恶补功课,在此做个...
    栗子酥小小阅读 2,682评论 0 0
  • 函数声明和函数表达式有什么区别? 1.声明的函数foo将会在执行前提升,因此foo在函数上下文都是可以被调用的,即...
    小囧兔阅读 2,415评论 0 1
  • 之前写过一篇JavaScript 闭包究竟是什么的文章理解闭包,觉得写得很清晰,可以简单理解闭包产生原因,但看评论...
    宁骥阅读 2,744评论 0 1
  • 一、大家可以先看一个例子 但是为了得到美女的名字,不死心的单身汪把代码改成了这样: 这下,美女是一个闭包了,单身汪...
    十字路口_x阅读 4,832评论 2 6

友情链接更多精彩内容