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 不胜感激 !