var one = true; function two(){ var three = true; function four(){/** */} if(true){ var five = true; function six(){} } console.log(five,six) } console.log(three) 复制代码
var one 作用域是全局作用域
function two 函数 two 的作用域也是全局作用域
var five 和 function six() 作用域和函数 function four 和 var three 一样都是函数
尝试去聊一聊 try catch
try { throw Error('error') } catch (error) { console.log(error) } 复制代码
但这个 error 标识符只在 catch 中可用
const tut = { title: 'machine learning' } with (tut) { console.log(title) } 复制代码
在 with 作用域内,可以查看对象 tut 的属性,无需 tut.title 直接就可以访问这个 title 变量,这个变量是存在于 with 作用域内的局部变量,外部无法访问。
var one = 1 function two(){} console.log(self.one); console.log(self.two) console.log(self) 复制代码
全局对象是 self,在一个文档(Document)中,全局对象是 window ,在 Node 中全局是 global。而新的部分是 globalThis,试图在所有这些地方实现标准化。
{ var one = 1; const one = 1; } 复制代码
可能因为 var one 突破包围其的花括号作用域,来到全局作用域,其实这样运行时是没有问题,不过解析时会报错,认为同一个作用域下声明了同名的变量。
<script> var one = 1 function two() { } </script> <script> </script> 复制代码
<script> var one = 1 function two() { } </script> <script> console.log(one);//1 console.log(self.one);//1 </script> 复制代码
<script> var one = 1 const two = 2 </script> <script> console.log(one);//1 console.log(self.one);//1 console.log(two);//2 </script> 复制代码
<script> var one = 1 const two = 2 </script> <script> console.log(one);//1 console.log(self.one);//1 console.log(two);//2 console.log(self.two)//undefined </script> 复制代码
在 script 间是共享全局对象的,。就ECMAScript而言,two 是一个全局。但是并不做将其挂到全局对象。因为从技术上讲,全局对象是在实际的全局上下文之下。好像是这样。这是我对V8 工程师 Yang 给出解释的理解。
<script type="module"> var one = 1 const two = 2 </script> <script type="module"> console.log(one);//1 console.log(self.one);//1 console.log(two);//2 console.log(self.two)//undefined </script> 复制代码
index.html:17 Uncaught ReferenceError: one is not defined 复制代码
如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star: http://github.crmeb.net/u/defu 不胜感激 !