您的位置:首页 > Web前端 > JavaScript

JavaScript 高级程序设计(第四章)基础知识点

2016-04-04 18:53 435 查看
**变量,作用域和内存问题**


4.1 ECMAScript变量的可能包含两种不同数据类型的值:基本类型值(简单的数据段)和引用类型值(多个值构成的对象)。

4.11 只能给引用类型值动态的添加属性。

引用类型值





基本类型的值





注:浏览器为IE8

4.12复制变量的值

基本类型值:

var num1=5;

var num2=5;

自己理解:num1和num2的值最后都是5(num2的5是num1的5的副本),但是num1中的5和num2中的5是完全独立的不会相互影响。

引用类型的值:

var obj1= new Object();

var obj2=obj1;

obj1.name=”sara”

alert(obj2.name);//”sara”

自己理解:obj1保存了一个新对象的实例,然后这个值被复制到了obj2中,这个值的副本是一个指针,obj1和obj2都指向同一个对象,当为obj1添加name属性时,也可以用obj2来访问这个属性。

4.13传递参数

ECMAScript中所有函数的参数都是按值传递的。也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。







在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量也会反映在函数的外部。





自己的理解:创建object对象然后赋值给变量person,person变量又被传递给setName函数中,在函数内部,person和obj引用的是同一个对象,当在函数内部给obj添加name属性时,person也会跟着改变。

按照引用传递的参数,不一定在局部作用域中修改对象就会在全局作用域反映出来。





注解:当函数内部重写obj时,这个变量引用就是一个局部对象了,而这个局部对象会在函数执行完毕时立即被销毁。

4.14检测类型

要检测一个变量是不是基本类型用typeof。

/* var s =”sara”;

var b=true;

var i= 22 ;

var u;

var n=null;

var o=new Object();

alert(typeof o);*/

已经一一测试,因为返回值不在同一个弹窗中就不截图了,以后会学会把多个弹窗改成一个弹窗的。

instanceof 用于判断一个变量是否某个对象的实例。

instanceof检测用来检测目标是什么类型的对象。

用法如下:

alert(person instanceof Object);//变量person是Object吗?

根据规定,所有引用类型的值都是Object的实例,在检测引用类型值和Object构造函数时,INSTANCEOF操作符始终返回TRUE.

4.2执行环境及作用域

执行环境定义了变量或函数有权访问的其他数据,决定了他们的各自行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。在WEB浏览器中,全局执行环境被认为是window对象。当代码在一个环境中执行时,会创建变量对象的一个作用域链,用途是保证对执行环境有权访问的所有变量和函数的有序访问。

var color=”blue”;

function changeColor(){

var anotherColor=”red”;

function swapCplors(){

var tempColor=anotherColor;

color=tempColor;

}

}

以上代码共涉及3个执行环境:全局环境,changeColor()的局部环境和swapColor()的局部环境。全局环境中包括color,changeColor()。changeColor()的局部环境中有anotherColor和swapColor(),color。swapColor()中的局部环境中只有tempColor,该变量只有在这个环境中访问到,他还可以访问其他两个环境中的所有变量,因为是他的父执行环境。

总结:每个环境都可以向上搜索作用域链,以查询变量和函数名。但是不能向下搜索。

4.2.1延长作用域链

执行环境的类型只有:全局和局部。

使用try-catch语句的catch块和with语句作用域链就会得到加长。

4.2.2

JavaScript没有块级作用域。



自己总结:书上说变量i在for循环执行结束后,依旧会存在与循环外部的执行环境中。但是我测试的时候却没有弹出任何值(IE8).

1)声明变量:

有var的声明变量是局部变量。



结果从函数中返回了,但是变量sum在函数外部访问不到。

没有var的声明变量





没有var声明变量就变成了全局,所以sum能弹出值。

2)查询标识符

如果在局部环境中找到了目标标识符,搜索过程停止,如果没找到,则继续沿用域链向上搜索。

4.3垃圾收集

标记清除(2008年为止,ie firfox opera Safari )

引用计数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript ie 8 浏览器