变量和上下文的一些

213 阅读2分钟

GO全局对象和VO(G)全局变量对象的关系

1.两者之间存在映射关系(一个改另一个跟着改)【除了基于let/const创建的变量】
2.在全局上下文代码执行的时候,遇到一个变量,首先看是否为全局变量
(如果是操作全局变量,【var/function声明会给window也设置一份】),
不是全局变量则继续看是否为GO的属性(如果是相当于省略window),
如果也不是则按照没有声明这个变量的错误处理

块级上下文

{
    console.log(foo)
    function foo(){1}//函数在块级里面变量提升只声明
    foo=1
    function foo(){2}//在全局和块级都会有一份function foo(){2}覆盖1
    //到执行最后一个foo才会给全局映射一份
}
console.log(foo)
1.在代码执行的时候,浏览器会把 function foo(){}这行代码之前所有对foo的操作,
不仅认为是私有的,也会给全局映射一份
2.但之后代码"对foo"的操作都是私有的了
#如果不是foo的变量还是属于全局的(function变量提升是声明加定义,var只定义)

函数块级上下文

    函数执行会形成私有上下文
    但是如果:
        1.有形参赋值默认值
        2.函数体中有声明过自己的私有变量(var/let/const)
    则会把函数体{}看做一个私有的块级上下文
    此时,函数执行有了两个上下文
    var x=1
    function func(x,y=function anonymous1(){x=2}){
        /*
            私有上下文(EC(FUNC))
                作用域链:<EC(FUNC),EC(G)>
                形参赋值:x=5  y=BBBFFF000(anonymous1函数[[scope]]:EC(FUNC)
                变量提升:var x;
            单独多形成一个私有的块级上下文(是把函数体{}当做块级上下文)
                作用域链:<EC(BLOCK),EC(FUNC)>
                变量提升:var x;并且会把私有上下文中形参x赋值的值给他
        */
        var x=3 //把EC(BLOCK)中的x改为3
        y()//EC(BLOCK)没有私有变量y,suoyi找EC(FUNC)中的y执行
        /*
            EC(anonymous1)
                作用域链:<EC(anonymous1),EC(FUNC)>
                形参赋值:
                变量提升
                代码执行:
                    x=2 把EC(FUNC)中的x修改为2
        */
        console.log(x) //输出EC(BLOCK)中的3
    }
    func(5)
    console.log(x) //=>1