1. 变量:
基本类型和引用类型的值:
可以直接操作保存在基本数据类型变量中的值-----基本数据类型值在内存中占据固定大小的空间,因此保存在栈中
操作引用数据类型,实际上是操作对象的引用,而不是直接操作内存对象(因为JS不允许直接访问内存中的位置),引用数据类型的值实际上是放在内存中的对象。-----但是给对象添加属性,是操作的内存中的对象,复制保存对象的某个变量时,操作的是引用。-----引用数据类型的值是对象,保存在堆中
复制变量的值:
引用数据类型的值复制时,复制的是引用
2. 检测对象是哪种类型的对象:variable instanceof constructor
3. 执行环境----每个执行环境都有一个与之关联的变量对象,该环境中定义的所有变量和函数都保存在这个变量对象中
① 全局执行环境:最外围的一个执行环境,被认为是window对象,所有的全局变量和函数都做为window对象的属性和方法被创建。当某个执行环境中的所有代码都执行完毕后(应用程序退出或者网页关闭或浏览器关闭等),该环境就会被销毁,随之变量和函数也被销毁。
② 函数的执行环境:每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,而在函数执行完毕后,栈将其环境弹出。
4. 作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链。其作用是,保证对执行环境有权访问的所有变量和函数有序访问。
作用域链的前端,始终是当前执行代码所在环境的变量对象,如果这个环境是函数,则将其活动对象作为变量对象。活动对象最开始只包含一个变量,即arguments对象,作用域链中的下一个变量对象来自包含(外部)环境,再下一个来自下一个包含环境。。。。。一直持续到全局执行环境(始终是作用域链中的最后一个对象)
5. 标识符(变量、函数、属性、函数参数的名字)解析是沿着作用域链一级一级的搜索标识符的过程。从标识符的前端逐级向后溯。
如:
var color = "blue";
function changeColor() {
if(color === "blue"){
color = "red";
}else {
color = "blue";
}
}
changeColor();
在函数changeColor() 的作用域链中包含两个对象:他自己的变量对象arguement对象和全局环境变量对象。该函数可以访问到color变量,就是因为可以在这个作用域链中找到他。
在局部环境中定义的变量可以在局部环境中与全局变量互换使用,如:
var color = "blue";
function changeColor() {
var anotherColor = "red";
function swapColors() {
var tempColor = anotherColor;
anotherColor = color;
color = tempColor;
//这里可以访问到tempColor anotherColor color 作用域链为swapColors的变量对象---changeColor()的变量对象---全局变量对象。
}
//这里可以访问到anotherColor color 作用域链为changeColor的变量对象---全局变量对象
}
6. 延长作用域链:当执行流进入catch 或 with 语句时,可以在作用域的前端临时增加一个变量对象,这个对象会在代码执行后被移除。-----即延长作用域链。
对于with语句来说,会将指定对象添加到作用域链中。
如:
function buildUrl() {
var qs = "?debug=true";
with(location) {
var url = href +qs;
}
return url;
}
这里,location为临时变量对象,添加到作用域链的前端,所以在外可以访问到url。
7. 不存在块级作用域
for(var i = 0;i<10;i++){
doSomething(i);
}
alert(i); //这里i虽然在for语句的括号内声明,但依旧存在于循环外部的执行环境中。
使用var声明的变量会自动被添加到最接近的执行环境中,若在函数中声明,则添加到函数的局部环境中,在with语句中,最接近的环境是函数环境。
如果初始化的变量没有用var声明,则该变量被添加到全局环境window对象中。
8. 查询标识符
当某个环境为了读取或写入而引用一个标识符时,会搜索该标识符的意义。搜索首先从该局部环境中进行,即作用域链的最前端,如果没有则向上搜索,直至找到该标识符。
注意:如果在局部环境中已经存在了某个变量了,就不会再向上搜索。
如:(在这个函数中,如果不使用window.color,就不会访问到全局的color对象)
var color = "red";
function getColor(){
var color = "blue";
return color; //blue 首先搜索getColor()的变量对象,查找是否含有color。
}