JavaScript 中的作用域(烧脑呀)

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

感谢 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 fivefunction six() 作用域和函数 function fourvar 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
复制代码

猜你喜欢

转载自juejin.im/post/7016660764224127012