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

时间:2023-01-01 12:16:49
             **变量,作用域和内存问题**

4.1 ECMAScript变量的可能包含两种不同数据类型的值:基本类型值(简单的数据段)和引用类型值(多个值构成的对象)。
4.11 只能给引用类型值动态的添加属性。
引用类型值
JavaScript 高级程序设计(第四章)基础知识点
JavaScript 高级程序设计(第四章)基础知识点
基本类型的值
JavaScript 高级程序设计(第四章)基础知识点
JavaScript 高级程序设计(第四章)基础知识点
注:浏览器为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中所有函数的参数都是按值传递的。也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。
JavaScript 高级程序设计(第四章)基础知识点
JavaScript 高级程序设计(第四章)基础知识点
JavaScript 高级程序设计(第四章)基础知识点
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量也会反映在函数的外部。
JavaScript 高级程序设计(第四章)基础知识点
JavaScript 高级程序设计(第四章)基础知识点
自己的理解:创建object对象然后赋值给变量person,person变量又被传递给setName函数中,在函数内部,person和obj引用的是同一个对象,当在函数内部给obj添加name属性时,person也会跟着改变。
按照引用传递的参数,不一定在局部作用域中修改对象就会在全局作用域反映出来。
JavaScript 高级程序设计(第四章)基础知识点
JavaScript 高级程序设计(第四章)基础知识点
注解:当函数内部重写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没有块级作用域。
JavaScript 高级程序设计(第四章)基础知识点
自己总结:书上说变量i在for循环执行结束后,依旧会存在与循环外部的执行环境中。但是我测试的时候却没有弹出任何值(IE8).
1)声明变量:
有var的声明变量是局部变量。
JavaScript 高级程序设计(第四章)基础知识点
结果从函数中返回了,但是变量sum在函数外部访问不到。
没有var的声明变量
JavaScript 高级程序设计(第四章)基础知识点
JavaScript 高级程序设计(第四章)基础知识点
没有var声明变量就变成了全局,所以sum能弹出值。
2)查询标识符
如果在局部环境中找到了目标标识符,搜索过程停止,如果没找到,则继续沿用域链向上搜索。
4.3垃圾收集
标记清除(2008年为止,ie firfox opera Safari )
引用计数