全局对象window下找不到const、let声明的变量???(第一次发现整个人都。。。)

212 阅读1分钟

工作是苦涩也是甘甜,丰富自己坚持不懈

昨天写this的默认绑定的时候无意间发现了问题,全局作用域找不到const、let声明的变量,上代码:

         // var a = '??'
        const  a = '76wenshu';
        function wenshu(){
            const b="????"
            debugger
            //调用栈wenshu
            console.log(a)
            console.log(b)

            // var a = '心里有火,眼里有光'
            //调用位置
            this.light()
            // console.log(Local);
            console.log(this)
            console.log(this.a)
            debugger
        }
        function light(){
            //调用栈 wenshu -> light
            console.log(this.a)
        }
        //调用位置
        wenshu()

conslet.png

看到这个瞬间蒙圈??满脸的问号。。。什么鬼东西?什么情况??

const 换成 var 就ok正常获取,//var在window下声明了一个a

我就在里边打了debugger。。。

截屏2021-09-11 上午8.41.46.png

发现了居然在window中没有找到我声明的a 在Script的作用域中看到了

//这块就涉及作用域和对象的内容了后期会写

[[scope]]:所有的JS函数都是对象,对象中有些属性我们可以访问,但有些不可以,不可以的这些这些属性仅供JS引擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。即作用域决定了代码区块中变量和其他资源的可见性。

这是我就又想起一个问题我们怎么引用外面的变量a,既然它不在window下那就直接

console.log(a)//76wenshu就得到了

个人观点:const和let在全局的声明被放到了特定的Script的块级作用域中所以在,里边的声明的函数可以直接使用变量a.

个人好奇:又在函数中声明了一个b

截屏2021-09-11 上午9.19.43.png

b在函数作用域中,在函数的scpoes中也看到了Script

总 结:记得const和let在全局声明的变量不在window下,就可以了