小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
感谢 Jake 和 Surma 分享视频的《Scope in JavaScript - HTTP203》因为个人技术和英语理解的局限性可能会出入,如果大家对下面难题有好的解释希望大家踊跃讨论。
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
复制代码