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

JavaScript变量和作用域

2017-05-20 20:46 148 查看
一、.基本类型和引用类型

       javascript 中包含基本类型(包括Underfined,Null,Boolean,Number,String等)和引用类型,基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。基本类型和引用类型的一些异同和特点如下:

1.基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;

2.从一个变量向另一个变量复制基本类型值,会创建这个值的一个副本;

3.引用类型的值是对象,保存在堆内存中;

4.包含引用类型值得变量实际上包含的并不是对象本身,而是一个指向该对象的指针;

5.从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;

6.确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符。

基本类型的值和引用类型的值创建时相似的,都是定义一个变量并赋值。而对于引用类型还可以为其动态的设置属性,直接通过点的方式设置:如下

var person = new Object();
person.name = "nick";
JavaScript在向函数中传递参数时都是按值传递的(无论传递的是基本类型还是引用类型),如以下代码

function addTen(num) {
num += 10;
return num;
}

var count = 20
var result = addTen(count);
alert(count);    //20
alert(result);   //30
因为是按值传递,count会被复制一份传递给函数,函数中count值的改变和函数外的count值没有关系,所以count的值还是20,并没有被改变。当传递的是引用类型时,情况有点复杂:

function setName(obj) {
obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name);    //"Nicholas"


光看这一段代码并不能看出参数是按值传递的(事实上更像是按引用传递),但真的是那么回事吗?我们再看下一段代码:

function setName(obj) {
obj.name = "Nicholas";
obj = new Object();//
obj.name = "Greg";//
}
var person = new Object();
setName(person);
alert(person.name);    //"Nicholas"
这段代码比上一段多了两行,而结果是相同的,让我们来分析一下这两段代码。实际上引用类型也是按值传递的,但是由于是引用类型,虽然又复制了一个变量传给函数,但是两个变量实际上指向的还是一个对象(因为是引用类型嘛)。在第二段代码中又新建了一个对象,这样函数内部的变量便指向了新创建的对象,所以第二次赋值并没有影响到person的属性值。如果是按引用传递的话,person也会指向新创建的对象,第二次修改值也会影响到person。

二、执行环境(作用域)

     执行环境是JavaScript中非常重要的一个概念。执行环境定义了变量或函数有权访问的其它数据,决定了它们各自的行为。JavaScript中作用域总共只有两种全局和局部(函数内部)。在Web浏览器中,全局执行环境被认为是window对象。每个函数都有一个执行环境。当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。所有变量(包括基本类型和引用类型)都存在于一个执行环境(作用域)当中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。

     js语言区别于Java等强类型语言的一个重要特点是没有块级作用域。在Java等类C语言中通常每个{}都有自己的作用域(即变量只在{}范围内生效等,用过这些语言的应该很清楚什么意思吧),但是JavaScript并不是这样。下面来看一下具体的例子:

function add(num1, num2) {
var sum = num1 + num2;
return sum;
}
var result = add(10, 20);  //30
alert(sum);     // 由于sum不是有效的变量,因此会导致错误
使用var声明的变量会被自动添加到最近的作用域中,所以这里被添加到了函数的作用域中,即在外部作用域无法访问,报错。而没有使用var定义的变量会被添加到全局中,所以下面的例子是可以执行的。
function add(num1, num2) {
sum = num1 + num2;
return sum;
}
var result = add(10, 20);  //30
alert(sum);                //30
查询变量:JavaScript中查询一个变量会先从局部作用域查找,如果找到便不在查找直接使用,没有找到再去全局作用域中查找。来看下面的代码:

var color = "blue";
function getColor(){
var color = "red";
return color;
}
alert(getColor());  //"red"
在这个例子中,当return color;时,回去寻找color变量,在局部作用域中存在,直接返回不在查找,所以调用函数得到的是red。如果函数内部没有var color="red";这句话,则会继续去全局作用域中寻找color,找到返回,此时得到的结果会是blue。
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: