4.1基本类型和引用类型的值

解析器要分析赋给变量的值是基本类型值还是引用类型的值
基本类型:undefined   null   boolean   number    string
引用类型的值:保存在内存中的对象    在javascript中不允许直接访问内存中的位置,即不能直接访问或操作内存空间。操作对象时,实际上是操作对象的引用。
   1-1
动态的属性
可以给引用类型的对象添加属性和方法,不可以给基本类型的值添加属性
例子:
var p=new object();//引用
p.name="mao";
var p2="jiben";//基本
p2.name="mao2"
alert(p.name);//mao
alert(p2.name);//undefined
. 1-2  复制变量的值
        基本类型是完全复制出一个副本
引用类型 是复制出一个指针副本   两个指针指向同一个内存中的对象
1-3   传递参数
所有函数参数都是按值传递,访问变量则有按值和按引用类型两种方式
基本类型的参数传递时,被传递的值(实参)会被复制给一个局部变量(形参即命名参数,也即arguments对象中的一个元素)。
引用类型的参数传递时,形式参数获得的是值在内存中的地址。局部变量的变化反应在函数的外部。
讲函数的参数想象成局部变量
1-4   检测类型
检测变量是否是基本数据类型   typeof操作符    如果变量的值是一个对象或null,则返回object
     检测变量是否给定引用类型的实例,instanceof操作符会返回true。如果使用instanceof检测基本类型的 值,则会返回false。
例子:alert(person instanceof object);
 
4.2   执行环境及作用域
每个执行环境定义了变量获函数有权访问的其他数据,决定各自行为,都有一个与之关联的变量对象。环境中定义的变量和函数都保存在这个对象中,解析器会在后台使用此对象。
web浏览器中,全局执行环境是window对象,所有全局变量和函数都是作为window对象的属性和方法创建的。该执行环境的所有代码执行完毕后,该环境被销毁。
       每个函数都有自己的执行环境,执行流进入一个函数,环境就会被推入到一个环境堆栈中。在函数执行完毕后,堆栈在将其弹出。将控制权返回给之前的执行环境。
创建对象变量的一个作用域链scope chain,作用是保证执行环境有权访问的所有变量和函数的有序访问。
        作用域链的前端,是所在环境的变量对象,arguments对象(在全局环境中不存在)--->下一个包含环境---->再下一个包含环境....-------->一直到全局执行环境(始终是最后一个)。
实例:
var color="blue";//全局
function changeColor(){
if(color==="blue"){color="red";}
else{color=“blue”;}
}
changeColor();
alert("Color is now"+color);
 
       函数changeColor()的作用域链包含   自己的变量对象  arguments的对象   和全局环境的变量对象(如此才可访问全局的color变量)。
实例2:
在局部作用域中定义的变量可以在局部环境中域全局变量互换使用
var color="blue";// 全局
function changeColor(){
var anotherColor="red";//局部1
function swapColors(){
var tempcolor=anothercolor;//局部2
anothercolor=color;
color=tempcolor;//当前环境下可以访问color   anothercolor和tempcolor
}
swapcolors(); //当前环境下可以访问anothercolor  和color
}
changecolor();//只能访问color
 
在特定的执行环境中,内部环境可以通过作用域链访问所有的外部环境不能访问内部环境中的任何变量和函数。
任何环境都不能通过向下搜索作用域链而执行环境。
4.2.1延长作用域链
环境的类型只有两种:局部和全局,但是也可有其他的方法来延长作用域。有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。两种情况
1.try-catch语句中的catch块   创建一个新的变量对象,其中包含被抛出的错误对象的声明
2.with语句    将语句中指定的对象添加到作用域链中。
4.2.2没有块级作用域
花括号括起来的部分就是块级,在c语言c++等高级语言中变量会在if语句或for语句的块内存在,当块语句执行完毕后,变量即被销毁。
但是在javascript中,if语句中的变量声明会将变量添加到当前的执行环境当中。在例子中是全局环境,所以在接下来的语句中,变量仍然有效
例子:
if(true){
var color="blue";
}
alert(color);//blue;
例子2:
for(var i=0;i<10;i++){dosomething(i);}
alert(i);//10  当for语句结束后  定义的i变量仍然在全局环境内 所以  值一直有效。
1.声明变量   使用var声明的变量会自动添加 到最接近的环境中。函数内部,最接近的环境就是函数的局部环境。
如果初始化变量时,没有使用var声明,则变量会被自动添加到外部的执行环境中
  例子:
function add(num1,num2){
var sum=num1+num2;
return sum;
}
var result=add(10,20);//30
alert(sum);//弹出错误   当把sum前面的var去掉后,结果是30
2.查询标识符
当在某个环境中为了读取或写入而引用一个标示符时,必须通过搜索来确定该标示符实际代表什么。搜索过程从作用域链的前端开始,向上逐级查询给定名字匹配的标示符。搜索到就停止。
例子:
var color="blue";
function getcolor(){
return color;
}
alert (getcolor());//blue   如果在getcolor函数内部加入var color=“red”;值就会变为red 因为调用的是局部的变量离着最近。
上图为第一种情况下的搜索示意图。
 

很明显的变量的查询需要时间,访问局部变量要比访问全局变量更快。

4.3垃圾收集
javascript垃圾会自动收集,而非像c或c++那样需要程序员手工清除垃圾释放内存空间。
垃圾收集器会按照固定的时间间隔周期性的执行。
4.3.1标记清除   常用的方式,
4.3.2引用计数  不常见
4.3.3  性能问题  垃圾收集器的周期性运行   调整周期值
4.3.4  管理内存     最有效的方法就是为执行中的代码只保存必要的数据。一旦数据不再游泳,最好通过将其值设置为null来释放其引用,此做法叫做解除引用。适合大多数全局变量和全局对象的属性。
function createperson(name){
var localperson=new object();
localperson.name=name;
return localperson;
}
var globalperson=createperson("nicholas");
globalperson=null;//手工接触globalperson的引用
解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

第4章--变量,作用域和内存问题 jquery的更多相关文章

  1. 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

      5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这 ...

  2. javascript高级程序设计第3版——第4章 变量作用域以及内存

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

    JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...

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

    执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后 ...

  5. js 变量 作用域及内存

    由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...

  6. 浅谈javascript中变量作用域和内存(1)

    先理解两个概念:基本类型和引用类型的值 1.基本类型和引用类型的值 (1)定义: 基本类型:指简单的数据段,比如按值访问的js五种基本数据类型undefined.null.boolean.number ...

  7. 浅谈javascript中变量作用域和内存(2)

    1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...

  8. js基础之--变量 作用域和内存问题

    基本类型:Undefind Null Boolean Number String 引用类型: 对象 在操作对象时,实际上实在操作对象的引用而不是实际的对象.为此,引用类型的值是按引用访问的. 从一个变 ...

  9. 第4章 变量、作用域和内存---JS红宝书书摘系列笔记

    一.基本类型和引用类型 ECMAScipt变量可能分为两种数据类型:基本类型和引用类型. 基本类型:指简单的数据段:包括Undefined.Null.Boolean.Number.String:可以操 ...

随机推荐

  1. Nginx FastCGI PHP

    We can see this comment in nginx.conf. # pass the PHP scripts to FastCGI server listening on 127.0.0 ...

  2. MovieReview—Kingsman THE SECRET SERVICE(王牌特工之特工学院)

    Brain Storming         Mr. Valentine's Day see excess human beings as the Earth's virus and try to e ...

  3. 人脸识别 python调用face++ 功能测试

    使用python调用face++的API,调用detect功能,识别人脸 首先进入face++官网注册,获得API Key和API Secret.使用官网提供的免费python api调用功能,提供了 ...

  4. Problem O: 国家排序

    Problem O: 国家排序 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 405  Solved: 253[Submit][Status][Web ...

  5. lca(最近公共祖先(在线)) 倍增法详解

    转自大佬博客 : https://blog.csdn.net/lw277232240/article/details/72870644 描述:倍增法用于很多算法当中,通过字面意思来理解 LCA是啥呢 ...

  6. NFS缓存IO机制

    NFS的缓存IO机制<一> async 参数模式下分析 NFS 默认的mount参数为async,async 参数表示内核不会透传程序的IO请求给sever,对于写IO会延迟执行,积累一定 ...

  7. 解决windows系统下打开应用弹出丢失libmysql.dll的问题

    只要把下载libmysql.dll,放到exe应用程序的所在目录,就可以运行,libmysql.dll有32位和64位版本,可以分别测试一下行不行,如果不行在换一个 版本试试.libmysql.dll ...

  8. 【转】MFC右键显示菜单之LoadMenu()

    如何在界面内单击右键弹出自己设置的菜单选项? 步骤如下: 1.在资源MENU里添加一个菜单资源,命名为IDR_POP_MENU. 2.在自己添加的菜单中添加事件,如事件1,事件2,事件3,分别添加响应 ...

  9. 【费用流】bzoj1834: [ZJOI2010]network 网络扩容

    还是稍微记一下这个拆点模型吧 Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求:  1.在不扩容的情况下,1到N的最大流:  ...

  10. 洛谷 1486/BZOJ 1503 郁闷的出纳员

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13866  Solved: 5069[Submit][Stat ...