• JavaScript-变量的作用域、let、const详解


    在 javascript 中,var 定义变量实际是有作用域的。

    假设在函数体中声明,则在函数体外不可以使用(可以用"闭包"实现)

    测试如下代码:

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script>
    7. function biu(){
    8. var x=1;
    9. x=x+1;
    10. }
    11. x=x+2;
    12. script>
    13. head>
    14. <body>
    15. body>
    16. html>

    此时浏览器会提示最后一个x缺少作用域:

    如果两个函数使用了相同的变量名,只要在函数内部就不冲突

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script>
    7. function biu(){
    8. var x=1;
    9. x=x+1;
    10. }
    11. function biu2(){
    12. var x='A';
    13. x=x+1;
    14. }
    15. script>
    16. head>
    17. <body>
    18. body>
    19. html>

    内部函数可以访问外部函数的成员,反之则不行,示例如下:

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script>
    7. function biu(){
    8. var x=1;
    9. function biu2(){
    10. var y=x+1; //2
    11. }
    12. var z=y+1; //报错
    13. }
    14. script>
    15. head>
    16. <body>
    17. body>
    18. html>

    假设,内部函数变量和外部函数的变量重名,在JavaScript中函数查找从自身函数开始,由'内'向'外'查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script>
    7. function biu(){
    8. var x=1;
    9. function biu2(){
    10. var x='A';
    11. console.log('inner'+x);
    12. }
    13. console.log('outer'+x)
    14. biu2();
    15. }
    16. biu();
    17. script>
    18. head>
    19. <body>
    20. body>
    21. html>

    js 会提升变量的作用域

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script>
    7. function biu(){
    8. var x='x'+y;
    9. console.log(x)
    10. var y='y';
    11. }
    12. //上述代码等价于
    13. function biu2(){
    14. var y;
    15. var x='x'+y;
    16. console.log(x);
    17. y='u'
    18. }
    19. biu();
    20. script>
    21. head>
    22. <body>
    23. body>
    24. html>

    结果:xundefined

    说明:js执行引擎,自动提升了y的声明,但是不会提升变量y的赋值,这个是在js建立之初就存在的特性,需要养成规范,所有的变量定义都放在函数的的头部,不要乱放,便于代码维护

    1. //规范写法
    2. function biu2(){
    3. var x=1,
    4. y=x+1,
    5. z,i; //undefined
    6. }

    全局函数

    1. <script>
    2. //全局变量
    3. var x=1;
    4. function f(){
    5. console.log(x);
    6. }
    7. f();
    8. console.log(x);
    9. script>

    全局对象 window

    1. <script>
    2. var x='xxx';
    3. alert(x);
    4. alert(window.x);//默认所有的全局变量都会自动绑定在window对象上
    5. script>

    alert() 这个函数本身也是一个window的变量;

    1. <script>
    2. var x='xxx';
    3. window.alert(x);
    4. var old_alert=window.alert;
    5. window.alert=function () {
    6. }
    7. //此时alert()失效
    8. window.alert(123);
    9. //恢复alert
    10. window.alert=old_alert;
    11. window.alert(456);
    12. script>

    说明JavaScript只有一个全局作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到,就会报错RefrenceError

    规范:

    由于我们所有的全局变量都会绑定到我们的window上,如果不同的js文件使用了相同的全局变量,如何能够减少冲突? ---> 定义一个唯一全局变量

    1. <script>
    2. //唯一全局变量
    3. var BiuApp={};
    4. //定义全局变量
    5. BiuApp.name='biubiu';
    6. BiuApp.add=function (a,b) {
    7. return a+b;
    8. }
    9. script>

    把自己的代码全部放在自己定义的唯一空间名字中,降低命名冲突的问题

    jQuery中就是使用的该方法:jQuery.name,简便写法:$()

    局部作用域 let:

    1. <script>
    2. function aaa(){
    3. for (var i = 0; i < 100; i++) {
    4. console.log(i)
    5. }
    6. console.log(i+1)// 问题:i出了这个作用域还可以使用
    7. }
    8. script>

    ES6 let关键字,解决局部作用域冲突问题

    1. <script>
    2. function aaa(){
    3. for (let i = 0; i < 100; i++) {
    4. console.log(i);
    5. }
    6. console.log(i+1);
    7. }
    8. script>

    建议都使用let去定义局部作用域的变量

    常量const:

    在ES6之前,怎么定义常量:只要用全部大写字母命名的变量就是常量,建议不要修改这样的值

    1. <script>
    2. var PI='3.14';
    3. console.log(PI);
    4. PI='3.14125';//可以改变这个值
    5. console.log(PI);
    6. script>

    在ES6引入了常量关键字const:

  • 相关阅读:
    node_exporter prometheus grafana 系统监控
    使用 Piral 创建微前端
    Linux桌面溯源
    JZ4 二维数组中的查找
    【unity记录】导入标准资源包(Standard Assets)
    springboot 实现跨域的几种方式
    RFID防盗安全门,自助借还书机,让图书馆发展进入新的里程碑
    SQL后计算的利器SPL
    基于Springboot实现点餐平台网站管理系统项目【项目源码+论文说明】
    【数据结构】手撕顺序表
  • 原文地址:https://blog.csdn.net/qq_61727355/article/details/126640886