• JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题


     <h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3>
    <h3>无需指定返回值,可以在任何时候返回任何值。未指定返回值的函数,返回的是一个特殊的undefined值</h3>

    <script type="text/javascript">
                function sayHi(){
                    console.log("Hi");
                };
                sayHi();
                function sayName(name,age){
                    console.log("我是"+name+",我今年"+age+"岁了!");
                };
                sayName("吴琼",18);
                function sum(num1,num2){
                    return num1+num2;
                    alert("我不会被执行到!");  //位于return语句之后的任何代码都不会执行。
                }
                sum(1,2);
                function compare(n1,n2){
                    if(n1<n2){
                        console.log(n1+"小于"+n2);
                    }else if(n2<n1){
                        console.log(n2+"小于"+n1);
                    }else{
                        console.log("他们俩相等!");
                    }
                }
                compare(2,2);
            </script>

    <h1>基本类型和引用类型的值</h1>
    <h3>在操作对象时,实际上是在操作对象的引用,而不是实际的对象。</h3>
    <h3 class="red">基本类型具有动态的值,引用类型具有动态的属性。</h3>
    <h3 class="red">复制变量值:基础类型是复制一个新值;引用类型是复制一个指针。</h3>
    <h3 class="red">传递参数:可以把函数的参数当成一个局部变量。基本类型传递参数是复制值给一个局部变量,引用类型传递参数是复制一个地址给变量对象;</h3>
    <h2 class="red">之前说到函数的参数是按值传递的,那么复制的这个地址可以当做一个值吗?答案:可以。为什么?</h2>
    <h3>检测变量:typeof 操作符可以确定一个变量是字符串、数值、布尔值,还是undefined的最佳工具。检测对象时,用instanceof操作符。</h3>

    <h1>执行环境(也称作用域)</h1>
    <h3>每个环境都有一个与之关联的变量对象。执行环境有2种:全局和局部(函数)。</h3>
    <h3 class="red">作用域链的作用:保证 (对执行环境有权访问的 )(所有变量和函数的) 有序访问;</h3>
    <h3>作用域链的前端始终都是所在环境的与之关联的变量对象。在Web浏览器中,window对象始终是最顶端。</h3>
    <h3>函数的参数也被当成变量来对待,访问规则与执行环境中的其他变量相同。</h3>
    <h2>延长作用域链</h2>
    <h3>try{}catch(e){}语句的catch块 和 with语句可以延长作用域链。</h3>
    <h2>没有块级作用域:像if语句中声明的变量和for语句中声明的循环变量,在外部均可以访问到;</h2>
    <h3>在函数中的变量如果想在外部访问,必须是全局变量(没有var声明的变量)。</h3>
    <h3>在函数中的变量查找规则是从内环境到外环境。</h3>
    <h1>垃圾收集:找出那些不在继续使用的变量,然后释放其占用的内存。常见的2个策略:标记清除和引用计数。</h1>
    <h3>关于垃圾收集产生的性能问题:IE6默认值,IE7根据内存用量动态的修改值,性能比IE6大大提高。</h3>
    <h3>关于管理内存:JavaScript分配给Web浏览器的可用内存量比分配给桌面应用程序的要少。</h3>
    <h2 class="red">内存限制会影响网页的性能:1、给变量分配的内存 2、调用栈以及在一个线程中同时执行的语句数量。</h2>
    <h2 class="red">确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式就是为执行中的代码只保存必要的数据。</h2>
    <h2 class="red">解除引用:将用不到的全局变量设置为null来释放其引用。此时,并没有释放内存,只是让值脱离了执行环境,下次垃圾回收时再释放。</h2>

    <script type="text/javascript">
                var a=1;
                var b=a;
                delete a;
                console.log(b); //a对b没有任何影响
                var obj1=new Object();
                var obj3=new Object();    
                var obj2=obj1;
                obj1.name="吴琼";
                console.log(obj2.name);
                obj2.name="张虹";
                console.log(obj1.name);
                console.log(obj3.name);
                var num = 1;
                function add(sum){
                    sum+=10;
                    console.log(sum);
                };
                add(num);  // 基本类型传递参数是把变量num的值复制给一个局部变量sum;
                console.log(num);  //变量的值并没有改变
                function odd(obj){
                    obj.name="吴琼";
                }
                var person = new Object();
                odd(person);
                console.log(person.name); 
                
                function odd2(obj){
                    obj.name="吴琼";
                    var obj = new Object();   //在函数内的变量引用的是一个局部对象,在函数执行完毕后会立即被销毁;
                    obj.name="张虹";
                };
                var person2=new Object();
                odd(person2);   //把person2传递给odd2()方法后,其name属性的值被定义为“吴琼”,如果是按引用传递的,则obj的name会被修改;
                console.log(person2.name);
                console.log(odd instanceof Function);
                //测试没有块级作用域
                if(true){
                    var color = "red";
                }
                console.log(color);  // red//测试没有块级作用域
                for(var i=0;i<10;i++){
                    //
                };
                console.log(i); //10 //测试没有块级作用域
                //函数中的变量在外部访问
                var sum;
                function fn(num1,num2){
                    sum = num1+num2;
                };
                fn(1,2);
                console.log(sum);  //如果函数内声明var sum 则报错sum is not defind
                //作用域链的查询
                var col = "black";
                function getCol(){
                    var col = "blue";  //从内到外查找  如果有这个声明,则 blue
                    return col;
                }
                console.log(getCol());  //blue
                getCol();  //执行方法后,函数内用var 声明的变量依然为局部变量
                console.log(col);//black
            </script>
    仅此杂文,留待后用。
  • 相关阅读:
    attempted to return null from a method with a primitive return type (Double).
    window7 虚拟机安装
    DB 与oracle 批量新增的写法
    oracle 修改表
    备份还原oracle数据库
    oracle数据库的字符集更改
    IMP-00013
    oracle创建用户授权权限
    java中添加定时任务
    程序在运行过程中变量的保存位置与生命周期
  • 原文地址:https://www.cnblogs.com/wow1314/p/7559716.html
Copyright © 2020-2023  润新知