JS作用域与作用域链

简介: JS作用域与作用域链

让我为大家介绍一下作用域与作用域链吧!

作用域

作用域规定了变量能够访问的“范围”,离开了这个“范围”变量便不能被访问。

作用域分为:局部作用域,全局作用域

一、局部作用域

局部作用域分为函数作用域与块作用域

1.函数作用域:

在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。

function fun() {
        // 函数内部是函数作用域 属于局部变量
        let num = 10
    }
    console.log(num); //报错 函数外部不能使用局部作用域变量

总结:

1.函数内部声明的变量,在函数外部无法被访问

2.函数的参数也是函数内部的局部变量

3.不同函数内部声明的变量无法互相访问

4.函数执行完毕后,函数内部的变量实际被清空了

2.块作用域:

在javaScript中使用{ }包裹的代码称为代码块,代码内部声明的变量外部将【有可能】无法被访问。

外部无法被访问的情况:

for (let i = 0; i < 3; i++) {
        // 块作用域 i只能在该代码块中被访问
        console.log(i);
    }
    console.log(i);// 报错 超出了i的作用域

外部可能被访问的情况:

for (var i = 0; i < 3; i++) {
        // var不会产生块作用域
        console.log(i);
    }
    console.log(i);// 正常输出

1.let声明的变量会产生块作用域,var不会产生块作用域
2.const声明的常量也会产生块作用域
3.不同代码块之间的变量无法相互访问
4.推荐使用 let 或 const

二、全局作用域

script标签.js文件的【最外层】就是所谓的全局作用域,在此声明的变量在函数内部也可以被访问。

全局作用域中声明的变量,任何其它作用域都可以被访问

// 全局作用域下声明了num变量
    let num = 1
    function fun() {
        // 函数内部可以使用全局作用域的变量
        console.log(num);//1
    }
    fun()

注意:
1.为window对象动态添加的属性默认也是全局的,不推荐
2.函数中未使用任何关键字声明的变量为全局变量,不推荐
3.尽可能少声明全局变量,防止全局变量被污染

作用域链

作用域链本质是底层的变量查找机制

在函数被执行时,会优先查找当前函数作用域中查找变量

如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域

// 全局作用域
    let num1 = 1
    let num2 = 2
    // 局部作用域
    function fun1() {
        let num1 = 1
        // 局部作用域
        function fun2() {
            num1 = 2
            console.log(num1) //2
        }
        fun2() //调用
    }
    fun1() //调用

fun2函数中查找,没有查找到到fun1()函数中查找,如果还是没查找到,到全局作用域中查找

总结:
1.嵌套关系的作用域串联起来形成了作用域链
2.相同作用域链中按着从小到大的规则查找变量
3.子作用域能够访问父作用域,父作用域无法访问子级作用域

感谢大家的阅读!借鉴了德华(pink老师)的内容。

  • List item
相关文章
|
2月前
|
JavaScript 前端开发
js的作用域作用域链
【10月更文挑战第29天】理解JavaScript的作用域和作用域链对于正确理解变量的访问和生命周期、避免变量命名冲突以及编写高质量的JavaScript代码都具有重要意义。在实际开发中,需要合理地利用作用域和作用域链来组织代码结构,提高代码的可读性和可维护性。
|
5月前
|
JavaScript 前端开发
浅谈js作用域
浅谈js作用域
39 0
|
2月前
|
自然语言处理 JavaScript 前端开发
[JS]作用域的“生产者”——词法作用域
本文介绍了JavaScript中的作用域模型与作用域,包括词法作用域和动态作用域的区别,以及全局作用域、函数作用域和块级作用域的特点。通过具体示例详细解析了变量提升、块级作用域中的暂时性死区等问题,并探讨了如何在循环中使用`var`和`let`的不同效果。最后,介绍了两种可以“欺骗”词法作用域的方法:`eval(str)`和`with(obj)`。文章结合了多位博主的总结,帮助读者更快速、便捷地掌握这些知识点。
37 2
[JS]作用域的“生产者”——词法作用域
|
2月前
|
前端开发 JavaScript 数据处理
CSS 变量的作用域和 JavaScript 变量的作用域有什么不同?
【10月更文挑战第28天】CSS变量和JavaScript变量虽然都有各自的作用域概念,但由于它们所属的语言和应用场景不同,其作用域的定义、范围、覆盖规则以及与其他语言特性的交互方式等方面都存在明显的差异。理解这些差异有助于更好地在Web开发中分别运用它们来实现预期的页面效果和功能逻辑。
|
2月前
|
JavaScript 前端开发
如何在 JavaScript 中实现块级作用域?
【10月更文挑战第29天】通过使用 `let`、`const` 关键字、立即执行函数表达式以及模块模式等方法,可以在JavaScript中有效地实现块级作用域,更好地控制变量的生命周期和访问权限,提高代码的可维护性和可读性。
|
2月前
|
JavaScript 前端开发
javascript的作用域
【10月更文挑战第19天javascript的作用域
|
3月前
|
JavaScript 前端开发
JavaScript 作用域
JavaScript 作用域是指程序中可访问的变量、对象和函数的集合。它分为函数作用域和局部作用域。函数作用域内的变量仅在函数内部可见,而全局作用域的变量在整个网页中均可访问。局部变量在函数执行完毕后会被销毁,而全局变量则在整个脚本生命周期中都存在。未使用 `var` 关键字声明的变量默认为全局变量。
|
3月前
|
JavaScript 前端开发
js作用域
js作用域
21 1
|
4月前
|
JavaScript 前端开发
JavaScript基础知识-作用域(action scope)
关于JavaScript基础知识中作用域的介绍。
66 1
JavaScript基础知识-作用域(action scope)
|
4月前
|
JavaScript 前端开发
js 变量作用域与解构赋值| 22
js 变量作用域与解构赋值| 22