JavaScript 中的作用域

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

上一篇:js修改样式属性的两种方式


下一篇:2021-09-27