作用域链&引用类型
执行环境与引用类型是JavaScript中的重要概念。
执行环境(execution context)
执行环境定义了变量和函数是否有权访问其它的数据,决定了他们各自的行为。全局执行环境是最外围的一个执行环境,在web浏览器中,全局执行环境被认为是widow对象。
每个函数都有其自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而且在函数执行之后,栈将起环境弹出,把控制权返还给之前的执行环境。
作用域链(scope chain)
作用域链的作用是保证对执行环境有权访问所有变量和函数的有序访问。如果这个作用域是函数,就存在一个arguments对象(这个对象全局环境是不存在的)。
var color = "blue";
function changColor(){
if(color === "blue"){
color = "red";
}else{
color = "blue" ;
}
}
changeClor();
console.log("color is now" + color)
在这个简单的例子中,changColor沿着作用域链获取的到了 color这个变量。
var color = "blue";
function changeColor(){
var anotherColor ="red";
function swapColor(){
var tempColor = anothercolor;
anotherColor = color;
color = tempColor;
//这里能访问:color、anotherColor、tempColor
}
//这里也能访问到color、anotherColor,但不能访问tempColor;
}
//这里只能访问到color;
cangeColor();
从上面的例子中 我们得出一个结论,任何环境都不能通过向下搜索作用域链来进行访问,但是由下向上却可以。
引用类型
基本类型、引用类型
- 基本类型值(数值、布尔值、字符串、null、undefined):指的是保存在栈内存中的简单数据段。
- 引用类型(对象、数组、函数、正则):指的是那些保存在堆内存中的对象,变量保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象。
基本类型是按值传递
var a = 4;
function fn(n){
n++
}
fn(a);
console.log(a);//最后的输出结果为4,并没有改变。
/*
function fn(n){
var n = arguments[0];
n++;
实际上并没有对a做任何改变;
}
*/
引用类型是按引用传递
var o ={
n: 10;
}
function fn(obj){
obj.n++;
}
fn(o);
console.log(o.n);//结果为11;
/*
function fn(obj){
var obj = arguments[0]; 这个临时变量被赋予的值,实际上是对象指针他直接指向堆内存里面的对象。
obj.n++ 他与外面的 o同时指向同一个变量,所以堆内存里面的数据也被更改。
}
*/
网友评论