JavaScript变量和作用域
2017-05-20 20:46
148 查看
一、.基本类型和引用类型
javascript 中包含基本类型(包括Underfined,Null,Boolean,Number,String等)和引用类型,基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。基本类型和引用类型的一些异同和特点如下:
1.基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;
2.从一个变量向另一个变量复制基本类型值,会创建这个值的一个副本;
3.引用类型的值是对象,保存在堆内存中;
4.包含引用类型值得变量实际上包含的并不是对象本身,而是一个指向该对象的指针;
5.从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;
6.确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符。
基本类型的值和引用类型的值创建时相似的,都是定义一个变量并赋值。而对于引用类型还可以为其动态的设置属性,直接通过点的方式设置:如下
光看这一段代码并不能看出参数是按值传递的(事实上更像是按引用传递),但真的是那么回事吗?我们再看下一段代码:
二、执行环境(作用域)
执行环境是JavaScript中非常重要的一个概念。执行环境定义了变量或函数有权访问的其它数据,决定了它们各自的行为。JavaScript中作用域总共只有两种全局和局部(函数内部)。在Web浏览器中,全局执行环境被认为是window对象。每个函数都有一个执行环境。当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。所有变量(包括基本类型和引用类型)都存在于一个执行环境(作用域)当中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。
js语言区别于Java等强类型语言的一个重要特点是没有块级作用域。在Java等类C语言中通常每个{}都有自己的作用域(即变量只在{}范围内生效等,用过这些语言的应该很清楚什么意思吧),但是JavaScript并不是这样。下面来看一下具体的例子:
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。
相关文章推荐
- javascript变量、作用域及内存
- JavaScript变量、作用域和内存问题(二)——垃圾收集器
- JavaScript变量与作用域
- javascript变量声明 及作用域
- javascript变量、作用域和内存问题......
- JavaScript变量、作用域及内存
- javaScript变量之作用域
- javascript变量声明 及作用域
- Dojo对不同浏览器(IE, Firefox)下JavaScript变量作用范围的影响
- javascript变量、作用域、命名空间
- JavaScript变量、作用域
- JavaScript变量与作用域
- Javascript变量、作用域和内存问题
- JavaScript变量和作用域
- javaScript变量的作用范围
- JavaScript变量与作用域
- JavaScript变量、作用域及内存问题
- javascript变量,作用域和内存问题
- 超级详解javascript变量引入、作用域与this指向