JavaScript的作用域 -- 小试牛刀(01)

145 阅读1分钟

js包括两级作用域: 1). 全局\color{red}{全局}作用域; 2). 函数\color{red}{函数}作用域;

1、全局作用域

  • 不属于任何函数的外部范围称为 全局作用域\color{#135ce0}{全局作用域}
  • 保存在全局作用域的变量称为 全局变量\color{#135ce0}{全局变量}

1.1 全局变量

  • 优点: 可反复使用;
  • 缺点: 容易造成全局污染。
    <script>
        var a = 0; // 全局变量
        function fn1(){
            var m = 0; 
        }
    </script>

2、 函数作用域

  • 一个函数内的范围称为函数作用域
  • 保存在函数作用域内的变量称为局部变量
    <script>
        function fn1(){
            <!-- 局部作用域 -->
            var b = 0; //局部变量
            function fn2(){
                var c = 0;
            }
        }
    </script>

特例: 形参变量也是函数内的局部变量\color{red}{形参变量也是函数内的局部变量} - 形参变量虽然没有用var声明,但是形参变量也是函数内的局部变量

  <script>
      function fn1(x){
          console.log(x); //局部变量
      }
  </script>

2.1 局部变量特点

  • 优点: 不会被污染
  • 缺点: 无法反复使用

注: 只有函数的\color{red}{只有函数的} { } ,才能形成作用域\color{red}{,才能形成作用域}

  • 不是所有{ }都能形成作用域;
  • 也不是所有{ }内的数据都能是局部变量。
  • 比如:
    • 对象的{ },就不是作用域;
    • 对象中的属性,也不是局部变量
    <script>
        var obj = {
            name: "冰墩墩",
        }
    </script>

注:JS中没有块级作用域\color{red}{JS 中没有块级作用域}

  • 函数\color{red}{函数}{ }之外的其余{ },都不是作用域\color{red}{作用域}
  • 内部的变量都会超出{ }的范围,从而影响外部程序。
 <script>
     console.log(a);
     if(false){ 
         var a=10; 
     }
     console.log(a); 
 </script>
 
    代码执行
    var a;//声明提前
     console.log(a); //不报错, undefined 
     if(false){
         //不是作用域,拦不住变量被声明提前
         a=10; 
     }
     console.log(a); 

3、终章思考

  • 为什么函数内获取对象属性的name,必须加this?
  • intr: function(){}的function能不能换成箭头函数'intr: ()=>{}'?
    <script>
        var lilei={
            name: "冰墩墩",
            intr: function(){ 
                console.log(“我是奥运吉祥物${this.name}”) 
            }
        }
    </script>