JavaScript-变量、作用域

  • 变量

    • 变量分为基本类型和引用类型,基本类型是简单的数据段,引用类型是由多个值构成的对象

    • 基本类型不能动态的添加属性值,而引用类型可以

      var person = "123" ;
      person.age = 12 ;  //无效
      
      var person = {} ;
      perage.age = 12 ;  //ok
      
    • js中基本变量类型的复制互不影响,复制引用类型变量(对象)是引用同一个对象

      var name1 = 'zs' ;
      var name2 = name1 ;
      name2 = 'lisi';
      alert(name1) ;  //zs
      
      var person1 = {} ;
      var person2 = person1 ;
      person1.age = 12 ;
      alert(person2.age) ;  //12
      
    • 函数参数的传递,所有参数的参数都是按值传递,虽然访问变量有按值和按引用两种方式,但是参数只能按值传递

      function add(num) {
          return num+num ;
      }
      var num1 = 10;
      var num2 = add(num1) ;
      console.log(num1);  //10
      console.log(num2);  //20
      
      //对象
      function setAge(person) {
          person.age = 12;
          var person = {};
          person.age = 24 ;
      } 
      
      var person1 = {}
      setAge(person1);
      console.log(person1.age);  //12,如果是按引用传递那么值应该为24
      
  • 作用域

    • 执行环境定义了变量或函数能访问的其他数据,定义了它们的行为,每个执行环境都有一个与之关联的变量对象,在环境中定义的所有变量和函数都保存着这个变量对象中

    • 每个函数都有自己的执行环境,当代码在一个环境中执行时,会创建变量对象的作用域链,作用域链的用途就是保证对执行环境中访问的变量和函数的有序访问。作用域链的前端,始终是当前执行代码所在的环境变量,而下一个环境变量就是包裹当前环境的外部环境,最后一个是全局环境。

    • 可以通过with或者catch延长作用域链

    • var定义的变量的作用域

      • 没有块级作用域

        {
          var color = 'red';
        }  //如果存在块级作用域,color已经被销毁
        alert(color);  //red
        
      • 被添加到最接近的环境中,如果不使用var声明,变量会被添加中全局环境中

        function add(num) {
          var result = num
          return result;
        }
        var num1 = add(10);
        alert(result);  //error
        
        function add(num) {
          result = num
          return result;
        }
        var num1 = add(10);
        alert(result);  //10
        
    • 查询变量时,根据作用域链查询,找到就返回

      //实例一
      var color = 'red'
      
      function getColor(){
          return color;
      }
      alert(getColor);  //red
      
      //实例二
      var color = 'red'
      
      function getColor(){
          var color = 'blue'
          return color;
      }
      alert(getColor);  //blue
      

你可能感兴趣的:(JavaScript-变量、作用域)