码迷,mamicode.com
首页 > 其他好文 > 详细

变量及作用域

时间:2016-02-17 23:53:14      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

JS的变量是松散型的,不强制类型决定了它只是在特定时间用于保存特定值的一个名字而已。由于不存在定义某个变量必须要保存何种数据类型值得规则,变量的值及其数据类型可以在脚本的生命周期内改变。

 

①基本类型和引用类型的值。

ECMAScript可能包含两种不同的数据类型的值:基本类型值和引用类型值。基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。 而引用类型则是指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。

将一个值赋给变量时,解析器必须确定这个值第基本类型值还是引用类型值。基本类型值有以下几种:Undefined、Null、Boolean、Number和String 。这些类型在内存中分别占有固定大小的空间,它们的值保存在栈空间,我们通过按值来访问的。

如果赋值的是引用类型的值,则必须在堆内存中为这个值分配空间,由于这种值得大小不固定,因此不能把它们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,先从栈中读取内存地址,然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问

技术分享

②动态属性

定义基本类型值和引用类型值的方式是相似的:创建一个变量并为该变量赋值。但是,当这个值保存到变量中以后,对不同类型可以执行的操作则是大相径庭。

var box = ‘Lee‘;    //基本类型值,是字符串
box.age = 28;       //基本类型值添加属性,很怪异
alert(box.age);     //不是引用类型,无法输出

var box = new Object();   //或者写成{},引用类型
box.name = ‘Lee‘;         //添加一个属性
alert(box.name);          //输出

 

③复制变量值

在变量复制方面,基本类型和引用类型也有所不同。基本类型复制的是值本身,而引用类型复制的是地址。

var box = ‘Lee‘;
var box2 = box;
box2 = ‘kkk‘;    //基本类型保持独立,box2的修改不会影响到box
alert(box2);     //弹出:kkk
alert(box);      //弹出:Lee


var box = new Object();
box.name = ‘Lee‘;
var box2 = box;     //把引用地址赋值给box2
box2.name = ‘kkk‘;  //因为他们指向的是同一个对象,一改都改
alert(box2.name);   //弹出:kkk
alert(box.name);    //弹出:kkk

 

④传递参数

ECMAScript中所有函数的参数都是按值传递的,言下之意,参数不会按引用传递,虽然变量有基本类型和引用类型之分。

function box(num) {    //按值传递,传递参数是基本类型
    num += 10;
    return num;
}
var num = 50;
var result = box(num);
alert(result);    //60
alert(num);       //50


function box(obj) {    //按值传递,参数是引用类型
    obj.name = ‘Lee‘;
    
}
var obj = new Object();
box(obj);
alert(obj.name);

 

⑤检测变量类型

要检测一个变量的类型,我们可以通过typeof运算符来判别。虽然typeof运算符在检查基本数据类型的时候非常好用,但检测引用类型的时候,它就不是那么好用了。通常,我们并不想知道它是不是对象,而是想知道它到底是什么类型的对象。这时候我们采用instanceof运算符来查看:

var box = ‘Lee‘;
alert(typeof box);

//instanceof运算符返回true或者false
var box = [1,2,3];
alert(box instanceof Array);
var box2 = {};
alert(box2 instanceof Object);
var box3 = /g/;
alert(box3 instanceof RegExp);

ps:当使用instanceof检查基本类型的值时,它会返回false

 

6.执行环境及作用域

执行环境是javascript中最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。

全局执行环境是最外围的执行环境。在web浏览器中,全局执行环境被认为是window对象。因此,所有的全局变量和函数都是作为window对象的属性和方法创建的。

var box = ‘Lee‘;    //声明一个全局变量
function setBox() {
    alert(box);   //全局变量可以在函数里访问
}
setBox();        //执行函数
alert(box);


var box = ‘Lee‘;
function setBox() {
    return 123;
}
alert(window.box);      //全局变量,最外围,属于window属性
alert(window.setBox()); //全局函数,最外围,属于window方法

 

函数里的局部作用域里的变量替换全局变量,但作用域仅限在函数体内这个局部环境。

var box = ‘Lee‘;
function setBox() {
    var box = ‘red‘;   //这个是局部变量,他的范围在setBox()里
}
alert(setBox());    //弹出:undefined
alert(box);        //弹出:Lee

var box = ‘Lee‘; function setBox() { box = ‘red‘; //去掉var就变成全局变量了 } alert(setBox());   //弹出:undefined alert(box);      //弹出:red

 

变量及作用域

标签:

原文地址:http://www.cnblogs.com/sosomark/p/5196850.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!