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>
时间: 2024-10-01 07:51:34

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

第一百零六节,JavaScript变量作用域及内存

JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 一.变量及作用域 1.基本类型和引用类型的值 ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是那些保存在栈

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

javascript变量作用域与内存

第四章 变量作用域与内存基本类型 5种Undefined Null Boolean Number String 两种变量类型 基本类型与引用类型注意:String 再其他语言中是引用类型,再javascri中为基本类型即:这五种基本类型是按值访问的 引用类型是按照引用访问的 动态的属性对于一个引用类型,一个引用变量被赋值后,可以为其添加属性,也可以删除与修改其属性var o = new object();o.name = "qi"; //可以为引用变量添加属性 变量的复制基本类型的复制

JavaScript变量作用域和内存问题(二)

执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后台可以看到.     全局变量的执行环境是最外围的执行环境,在web浏览器中,全局执行环境就是window对象,所以所有的函数和全局变量都可以作为window对象的一个属性.其他执行环境都是在函数和变量执行完毕后销毁内存,变量和函数也随之销毁,而全局变量也是在关闭页面或浏览器的时候销毁.    “

JavaScript基础之函数和变量作用域

函数:封装一项任务的步骤清单的代码段,再起一个名字 ( js中函数也是一个引用类型的对象,函数名其实也是引用函数对象的普通变量.) 函数对象:内存中专门存储一个函数定义的存储空间 函数定义的存储位置在window之外. 何时使用:一项任务可能反复使用时,就仅需要在函数中封装一次,反复调用函数即可. 如何声明函数: function 函数名([参数1,参数2,...]){ 步骤清单 return 返回值 } 参数:专门接受函数调用时,必要数据的变量 如何使用参数:在函数内,参数变量的使用和普通变量

JavaScript变量作用域和内存问题(js高级程序设计总结)

1,变量 ECMAScript和JavaScript是等同的吗?个人认为是否定的.我的理解是这样的,ECMAScript是一套完整的标准或者说协议,而JavaScript是在浏览器上实现的一套脚本语言.也就是说,ECMAScript是JavaScript的父类标准.JavaScript是ECMAScript的具体实现.所有ECMAScript定义的数据类型或者语言特性实际上都是伪代码的形式规定的.当然如果可以,ECMAScript也可以有服务器实现,单片机实现(不一定恰当).如果说ECMAScr

2016-05-30 函数与变量 作用域

1. 如何访问函数内的局部变量 <script> //获取函数内部变量的两种方法 function fn1(){ var a='100000美金'; } alert(a);//报错 a isNot undefine; //解决方法1: 通过把局部变量赋值给全局变量 var str=''; function fn1(){ var a='100000美金'; str=a; } fn1();//必须先调用函数,否则里面赋值不会自动执行 alert(str);//'100000美金' //解决方式2

python 函数及变量作用域及装饰器decorator @详解

一.函数及变量的作用 在python程序中,函数都会创建一个新的作用域,又称为命名空间,当函数遇到变量时,Python就会到该函数的命名空间来寻找变量,因为Python一切都是对象,而在命名空间中,都是以字典形式存在着,这些变量名,函数名都是索引,而值就是,对应的变量值和函数内存地址.在python中可以用globals()查看全局变量,locals()局部变量. >>> global_v = '全局变量' >>> def func(): ... local_v = '

JavaScript进阶之路(二)——变量与基本数据类型

前言 JavaScript中的变量为松散类型,所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值,就是不像SQL一样申明某个键值为int就只能保存整型数值,申明varchar只能保存字符串.一个变量所保存值的类型也可以改变,这在JavaScript中是完全有效的,只是不推荐.相比较于将变量理解为“盒子“,<JavaScript编程精解>中提到应该将变量理解为“触手”,它不保存值,而是抓取值.这一点在当变量保存引用类型值时更加明显. JavaScript中变量可能包含两种不同的数据类型