javaScript入门2--变量,作用域,内存
变量类型:基本类型和引用类型
基本类型上节已经提到。基本类型的值是按值传递的,既改变形参的值不会影响实参
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var x=1;
function a(o){
o=100;
alert(o);
}
a(x);
alert(x);
</script>
</body>
</html>
其中,a(x)为100 ,alert(x)为1 可见js的基本类型是按值传递的
引用类型:由多个值构成的对象,是按照共享传递的,也就是对象属性的形参的改变会影响对象属型的改变,对象形参的改变不会影响对象的改变。
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body> <script>
var obj={x:1};
function a(){
arguments[0].x=2;
} a(obj);
alert(obj.x);
</script>
</body> </html>
可见alert(obj.x)为2 由此知对象属性的形参的改变会使对象的属性改变
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body> <script>
var obj={x:1};
function a(){
arguments[0]=2;
} a(obj);
alert(obj.x);
</script>
</body> </html>
alert(obj.x)为1 可见对象的形参的改变不会影响对象
还有一点要注意的是,JavaScript有声明提前的特性,也就是说你可以先调用一个变量,然后声明,但是变量的赋值是不会提前的。
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body> <script>
alert( a);
var a=1;
</script>
</body> </html>
此时alert返回的结果是undefined ,可见a确实声明了
在变量的复制过程中,按值传递与按共享传递也是不同,对于按值传递 在string基本类型中,每一次对字符串的修改操作,实际都是新建了一个变量。
var a=1;
var b=a;
其过程是a,b是完全独立的,这两个值参与的任何操作不会互相影响
按共享传递
var obj1={x:1};
var obj2=obj1;
obj2.x=2;
alert(obj1.x);
此时,alert输出的值也为2,可见属性的改变时会相互影响的,但对象之间互不影响。
instancof操作符 用于检查对象的类型,如Array,RegExp 用法实例:alert(colors instanceof Array); 其返回值为boolean
作用域
(执行)环境:js的最重要的概念。每个执行环境都有一个关联的变量对象,改环境中的变量和函数都保存在这个变量对象中,解释器在后台会使用它。
全局执行环境的变量对象是window,那么这个window对象就保存着全局变量和函数。
每一个函数都有一个执行环境,可以理解为局部环境,但执行流到达函数时,环境会置于一个环境栈中,当执行完毕后,环境栈会把这个函数环境弹出,继续执行下一个环境。
当一个环境遇到执行流时,会创建变量对象的一个作用域链,改作用域链的前端为当前的变量对象,如这个环境是函数,那么这个变量对象又称为活动对象,这个对象做开始只包含一个arguments变量。作用域链的下一个变量对象是包含环境,在下一个亦是上一个的包含环境,所以,作用域链的末尾的变量对象永远都是window(全局执行环境的变量对象),那么,内部环境可以通过作用域链访问外部环境,外部环境则不能。
也就是说,var声明的变量会被自动添加到离他最近的环境中(向上),在函数内部,就是该函数的环境,在with中,也是相应的环境。
那么,可以通过with或者try--catch来演唱作用域链,即在作用域链的前端增加一个变量对象。如下
function a(){
var a=true;
with(location){
var url=href+a;
}
return url;
}
a();
需要注意一点,js没有块级作用域
变量查询(查询标识符)当某个环境为了读取或者引用一个标识符时,就要进行检索过程,搜索过程从作用域链的前端开始,向上逐级查询,遇到匹配的就停止。
垃圾收集:js具有自动清除垃圾的能力,切这个功能是循环进行的(时间间隔),垃圾清理主要是为了减少内存的浪费,对不再使用的变量进行销毁,释放内存。
1.标记清除法:js既然要自动清除垃圾,那么就要知道哪些是需要清理的,哪些是需要保留的,最简单的方法便是mark,当执行流执行到一个变量时,这个变量会被标记为“进入环境”,当执行结束后,便会被标记“离开环境”,当然标记的方法是多种多样的,可以是位翻转或者列表,这也是标记清除的思想。在标记清除中,垃圾收集器在运行时会对所有内存中的变量都加上标记,然后,他会去掉环境中的变量以及被环境中的变量引用的变量的标记,在此之后,在为这些变量添加标记,这些变量将被视为要删除的变量,最后完成内存清除操作。
2.引用计数:跟踪记录每个值得引用次数,每被变量引用一次,就加1,若变量去了其他的值,就-1,直到为0,进行清除。这回倒着一个循环引用问题的出现,导致内存的浪费。
javaScript入门2--变量,作用域,内存的更多相关文章
- 3. Javascript学习笔记——变量、内存、作用域
3. 变量.内存.作用域 3.1 基本类型和引用类型的值 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值[Undefined.Null.Boolean.Number 和 Strin ...
- JavaScript基础——理解变量作用域
一旦你开始在JavaScript应用程序中添加条件.函数和循环,就需要理解变量作用域.变量作用域规定了如何确定正在执行的代码行上的一个特定变量名的值. JavaScript允许你既定义全局版本又定义局 ...
- javascript中的变量作用域以及变量提升
在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...
- javascript中的变量作用域以及变量提升详细介绍
在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解变量作用域 “一个变量的作用域表示这个变量存在的上下文 ...
- 【JavaScript 从零开始】变量作用域
变量作用域 一个变量的作用域(scope)是程序源代码中定义这个变量的区域. 全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的.然而在函数内声明的变量只是函数体内有定义. 他 ...
- JavaScript学习系列2一JavaScript中的变量作用域
在写这篇文章之前,再次提醒一下 JavaScript 是大小写敏感的语言 // 'test', 'Test', 'TeSt' , 'TEST' 是4个不同的变量名 JavaScript中的变量,最重要 ...
- JavaScript中的变量在内存中的具体存储形式
栈内存和堆内存 JavaScript中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固 ...
- 《JavaScript 高级程序设计》读书笔记四 变量 作用域 内存
一 变量(基本类型和引用类型) a.基本类型保存值,保存在栈内存,引用类型保存指针,保存在堆内存: b.所有函数的参数都是按值进行传递的,不管参数是何种类型: c.检测类型 typeof ...
- JavaScript要点 (一) 变量-作用域
JavaScript 作用域 作用域—可访问变量的集合. 全局变量或者函数可以覆盖window对象的变量或者函数: 局部变量和window对象可以覆盖全局变量和函数. JavaScript 作用域 在 ...
- javascript中的变量作用域
在网上看了一道js面试题 <script type="text/javascript"> var tt = 'aa'; function test() { alert( ...
随机推荐
- 移动端页面的head头部内容
- 再看Core Data中PSC陷入死锁的问题
在<Core Data Programming Guide>文档的Concurrency with Core Data这一章节中提到了“Use Thread Confinement to ...
- apiCode/1/1.1/1.1.1
public abstract class myClass { private string id = ""; private string name = "" ...
- android获取手机的所有通讯录的号码和sim卡号码
============personer================================================ package com.qgc.cantent.entity; ...
- 在Button的click事件中引起客户端JavaScript
void action1_Execute(object sender, SimpleActionExecuteEventArgs e) { WebWindow.CurrentRequestWindow ...
- 解决WebService 中泛型接口不能序列化问题
本来要定义WebServices 方法返回一泛型接口集合IList,系统提示不能序列化泛型接口集合 1 [WebMethod] 2 public IList<Employ ...
- 查找DOM
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Linux下MySQL5.6的修改字符集编码为UTF8
一.登录MySQL查看用SHOW VARIABLES LIKE 'character%';下字符集,显示如下: +--------------------------+---------------- ...
- Commons IO方便读写文件的工具类
Commons IO是apache的一个开源的工具包,封装了IO操作的相关类,使用Commons IO可以很方便的读写文件,url源代码等. 普通地读取一个网页的源代码的代码可能如下 InputStr ...
- 2016 icpc-camp 之旅(一)
啦啦啦,终于前往icpccamp啦! 嗯,该死的飞机居然晚点了! 诶,晚点居然还会发赔偿金! 飞机上没什么好说的,和萌神一起看了5集龙与虎,然后就到了. 讲道理,海南航空感觉一般. 我的座位前面有个平 ...