工作是苦涩也是甘甜,丰富自己坚持不懈
昨天写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()
看到这个瞬间蒙圈??满脸的问号。。。什么鬼东西?什么情况??
const 换成 var 就ok正常获取,//var在window下声明了一个a
我就在里边打了debugger。。。
发现了居然在window中没有找到我声明的a 在Script的作用域中看到了
//这块就涉及作用域和对象的内容了后期会写
[[scope]]:所有的JS函数都是对象,对象中有些属性我们可以访问,但有些不可以,不可以的这些这些属性仅供JS引擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。即作用域决定了代码区块中变量和其他资源的可见性。
这是我就又想起一个问题我们怎么引用外面的变量a,既然它不在window下那就直接
console.log(a)//76wenshu就得到了
个人观点:const和let在全局的声明被放到了特定的Script的块级作用域中所以在,里边的声明的函数可以直接使用变量a.
个人好奇:又在函数中声明了一个b
b在函数作用域中,在函数的scpoes中也看到了Script
总 结:记得const和let在全局声明的变量不在window下,就可以了