JavaScript学习笔记(一)——变量、作用域问题

一、基本类型和引用类型的值

ECMAScript变量包含两种不同数据类型的值:基本类型值和引用类型值。

基本类型值指保存在栈内存中的简单数据段,即完全保存在内容中的一个位置。

引用类型值则指保存在堆内存中的对象,实际上保存的是一个指针,指向内存的另一个位置,该位置保存对象。

1.动态属性

对于引用类型的值,可以为其添加属性与方法,例如

var person=new Object();
person.name="Tom"
alert(person,name);

 但是对于基本数据类型的值则无法添加属性。

2.复制变量值

如果从一个变量向另一个变量复制基础类型值的时候,会在栈中创建一个新值,这两个值之间相互独立,互不影响。

var num1=5;
var num2=num1;
num2=7
alert(num1)  //输出5
alert(num2)  //输出7

 如果复制的是引用类型的时候,会在栈中创建一个指针,此时两个指针指向同一对象。当修改对象的属性值时,无论调用的是哪一个指针,传出来的值都是一致的,因为指向的是同一空间里的内容,除非指针指向改变。

var obj1=new Object();
var obj2=obj1;
obj1.name="Tom"
alert(obj2.name);   //输出Tom

注意:函数的参数在进行传递的时候,与这个原理相同。

二、执行环境和作用域

执行环境(execution context)定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的变量对象,环境中定义的变量和函数都保存在这个对象中。

在Web浏览器中,全局执行环境被认为是window对象,因此所有的全局变量和函数都是作为window对象的属性和方法创建的。当执行环境的所有代码运行完毕后,该环境也随之销毁(全局执行环境直到应用程序退出——例如关闭浏览器时才销毁)。

当我们的代码在环境中执行的时候,都会形成一条作用域链,以保证变量与函数的有序访问。

var color="blue";
function changeColor(){
    var anotherColor = "red";
    function swapColor(){
        var temp=anotherColor;
        anotherColor=color;
        color=temp;
    }
    swapColor();
}
changeColor();
alert(color)   //输出red

每个环境都可以向上搜索作用域链,以查询变量名与函数,但任何环境不得向下搜索作用域链而进入另一个执行环境。

注意:(1)使用try-catch中的catch块、with语句,这两种方法可以延长作用域。

           (2)JavaScript没有块级作用域,即if、for语句中定义的变量,依旧会存在与外层的执行环境中。

1.声明变量

变量在未经声明的情况下初始化,那么变量会被自动添加到全局环境中。

function add(num1,num2){
    var sum=num1+num2;
    return sum;
}
var result=add(5,10);
alert(sum)  //出错,sum不是有效变量

此时在全局环境中是无法访问到add函数中的sum变量的。

function add(num1,num2){
    sum=num1+num2;
    return sum;
}
var result=add(5,10);
alert(sum)  //30

运行完add函数后,由于sum是在全局环境中,因此可以继续进行访问。

2.查询标识符

在某个环境中为了查询一个标识符,会在作用域链的最前端进行查询,如果再局部查询到,则搜索停止,否则直到全局环境中。

var color="red"
function find(){
    return color;
}
alert(find());  //red

首先在局部中搜索color,局部中不存在则向上进行搜索,在全局环境中找到color的标识符,则停止。

var color="red"
function find(){
    var color="blue"
    return color;
}
alert(find());  //blue

在这个搜索过程中,已经在局部里发现了color标识符,则无须到全局环境中查找。

猜你喜欢

转载自blog.csdn.net/noingw96/article/details/84744589