zoukankan      html  css  js  c++  java
  • javascript 红宝书笔记之函数、变量、参数、作用域

    ECMAScript 不介意传进来多少个参数,也不介意传进来的参数类型。
     
     
    理解参数:
         命名的参数只提供便利,不是必需的。
     
     
    ECMAScript 的变量包含两种不同的数据类型的值。分别是
    • 简单的数据构成的基本数据型值,不能给基本型值添加属性:
              var name = "kevin";
              name.age = 27;
              console.log(name.age);     //undefined
    • 多个值构成的对象,引用类型值.引用类型的值,可以添加动态属性,并可以改变这个动态属性的值或者可以删除这个动态属性的值
              var name = new Object();
              name.age = 27;
              console.log(name.age);     //27
     
    ECMAScript 操作对象,实际上是在操作对象的引用而不是实际的对象。
     
    复制变量值
     
    • 基本类型的值
              var name = "kevin";
              var name2 = name;        //name的值是kevin;name2的值同样也是kevin;它们在各自的作用域中参与任何操作都不会互相影响,因为name2是独立的,互不干涉的。
    • 引用型值
              var name = new Object();
              var name2 = name;
              name.age = 27;
              console.log(name.age);   //27  与上面的基本类型的值不同的是,这里的name2实际上是name的一个指针,而这个指针指向name的一个对象,因此,这个name2同样引用的是一个对象,而且与name是同一个对象。
     
    传递参数
     
         ECMAScript中所有的函数的参数都是按值传递的。
         
    • 基本类型的参数传递,按值传递
              在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,就是arguments对象中的一个元素。
              function add(num){
                   num = 30;
                   console.log(num);      //这个参数实际上是这个函数的局部变量,它的值仍为30
              }
     
              var num2 = 10;
              var num3 = add(num2);
              console.log(num2);          //10
              console.log(num3);          //40,调用这个函数时,变量num2作为参数被传递给这个函数了。而这个addr()的函数的值为局部变量的值30,                        再加上传递进来的值 num2 = 10,最后num3的值为40
     
    • 引用类型的参数传递,按对象传递
              换句话说,即使这个变量是按值传递的,被传递的这个值也会按引用来访问同一个对象。也就是说,即使是在函数内部修改了参数的值,但是原始的引用仍然保持不变。
              function setName(obj){
                  obj.name = 'kevin';          //obj的默认的name属性值为kevin
                  obj = new Object();          //为obj重新定义一个新的对象,这个对象为局部对象
                  obj.name = 'Greg';           //为这个新的局部对象定义一个不同值的name属性
              }
     
              console.log(obj.name);           //kevin,  为什么这里的值是kevin呢,这是因为,实际上,在函数内部重写obj时,这个变量的引用,其实就是一个局部对象了,这个局部对象会在函数执行完毕之后立即销毁
     
              var person = new Object();
              setName(person);
              console.log(person.name);       //kevin
     
    可以把ECMAScript函数的参数想象成局部变量          
              
     
    执行环境,决定了变量的生命周期,以及哪一部分代码可以访问其中的变量
     
         执行环境定义了变量或函数有权访问的其它数据,决定他们的各自行为,每个执行环境都 有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。我们编写的代码无法访问这个对象。
     
    • 全局执行环境,直到应用程序退出,如关闭网页或浏览器时才会被销毁。
     
         每个函数都有自己的执行环境。
     
         var name = 'kevin';
         function changeName(){
              if(name === 'kevin'){
                   name = 'page';
              }else{
                   name = 'kevin';
              }
         }
     
         changeName();
         console.log("name is now" + name);
     
    • 块级作用域,javascript没有块级作用域
      • 对于javascript中,由for 语句创建的变量 i ,即使是在for语句执行结束后,也依旧会存在于循环外部的执行环境中。
     
                   for(var i = 0; i < 10; i++){
                        doSomeThing(i);
                   }
                   alert(i);   //10
     
    • 声明变量,在javascript中,不声明而直接给变量赋值是不可行的
      • 使用 var 声明的变量,会被自动添加到最接近的环境中;
      • 使用 with 声明的变量,最接近的环境是函数环境;
      • 初始化变量时,没有使用 var 声明,该变量会自动添加到全局环境中;
              function add(num1, num2){
    1.                var sum = num1 + num2;    //声明并初始化
    2.                sum = num1 + num2;        //没有声明直接初始化
                   return sum;
              }
     
              var result = add(10, 20);
              console.log(sum);              
    如果为1,是打印不到sum的,因为var sum为函数内部变量,函数执行完毕自动销毁;
    如果为2,是可以打印到的,因为,没有被var声明,它是一个全局变量,sum不会被销毁,后面的代码依旧可以访问它。
              
     
  • 相关阅读:
    MemoryCache
    Page.Cache
    webform运行时弹出JavaScript的alert窗口
    server.Transfer不工作
    Server.Transfer VS Response.Redirect – Simplified
    Code Pages
    Unicode, UTF, ASCII, ANSI format differences
    Character Encoding in .NET
    分布式之消息队列复习精讲
    Understand:高效代码静态分析神器详解(一)
  • 原文地址:https://www.cnblogs.com/baiyygynui/p/5536916.html
Copyright © 2011-2022 走看看