js004-变量、作用域和内存问题
js004-变量、作用域和内存问题
4.1 基本类型和引用类型的值
基本类型:简单的数据段 |
引用类型:可能由多个值构成的对象 |
五种基本数据类型:undefined、null、boolean、Number、string。 这是按值访问的,因为可以操作保存在变量中的实际的值 |
引用类型的值是保存在内存中的对象,Javascript不允许直接访问内存中的位置,也就是说,不能直接操作对象的空间。在操作对象时,实际上是在才作对象的引用而不是实际的对象。 引用类型是按引用访问的 |
4.1.1 动态的属性
定义两种类型的方法类似:创建一个变量并为该变量赋值。
var person = new Object(); person.name = "meimei"; alert(person.name); |
4.1.2 复制变量值
从一个变量向另一个变量复制基本类型值和引用之时,也存在差异。
复制基本类型值(在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上) |
当一个变量向另一个变量复制引用类型值时,操作的实际上是一个指针,这个指针指向存储在堆中的一个对象 |
var num1 = 5; var num2 = num1; alert(num2); //5 |
var obj1 = new Object(); var obj2 = obj1; obj1.name = "meimei"; alert(obj2.name); //"meimei" |
4.1.3传递参数
ECMAScript中所有的函数的参数都是按值传递的。
访问变量可以按值或者按引用两种方式,但是参数只能按值传递
向参数传递引用类型值时: 参数是函数的局部变量。 |
使用对象来说明按值传递参数: |
function addTen(num){ num += 10; return num; } var account = 20; var result = addTen(account); alert(count); //20 alert(result); //30 |
function setName(obj){ obj.name = "meimei"; } var person = new Object(); setName(person); alert(person.name); //"meimei" |
对象是按值传递的:
function setName(obj){ obj.name = "meimei"; obj = new Object(); obj.name = "lal" } var person = new Object(); setName(person); alert(person.name); //"meimei" |
当函数内部重写obj时,这个变量引用的就是一个局部对象了。这个对象在函数执行完后立即被销毁。 |
变量引用:案例1:
案例2:
案例三:
4.1.4 检测类型
typeof 用于基本数据类型的检测: |
instanceof: result = variable instanceof constructor |
var s = "meimei"; var b = true; var i = 22; var u; var n = null; var o =new object; alert(typeof s); //string alert(typeof b); //number alert(typeof i); //boolean alert(typeof u); //undefined alert(typeof n); //object alert(typeof o); //object |
alert(person instanceof Object); //变量person是Objict对象吗 alert(colors instanceof Array); //变量person是Array吗 alert(patttern instanceof RegExp); //变量person是RegExp吗 |
在检测引用类型值的时候不大起作用 |
根据规定,所有引用类型的值都是Objict的实例,因此,在检测一个引用类型值和Object函数时,instanceof操作符始终会返回true。如果,使用instanceof操作符检测基本类型值,该操作符会始终返回false |
4.2 执行环境及作用域
每个函数都有自己的执行环境
1、 var color = "blue"; function changecolor(){ if (color === "blue") { color = "red"; }else{ color = "blue"; } } changecolor(); alert("color is now" + color); |
|
2、 var color = "blue"; function changecolor(){ var anothercolor = "red"; function swapcolors(){ var tempcolor = anothercolor; anothercolor = color; color = tempcolor; //这里可以访问 tempcolor anothercolor color } swapcolors(); //这里可以访问 anothercolor color 但是不能访问tempcolor } changecolor(); //这里只能访问color |
以上第二份代码变量的作用域链:
4.2.1 延长作用域链
当执行流进入下列任何一个语句时,作用域链就会得到加长:
try-catch 语句的catch块;
with块
这两个语句都会在作用域链的前端添加一个变量对象,with会将制定的对象添加到作用域链中。Catch 会创建一个新的变量对象,包含的是被抛出的错误对象的声明。例如:
function buildUrl(){ var qs = "?debug=true"; with(location){ var url = href + qs; } return url; } |
4.2.2 没有块级作用域
if |
for |
if (true) { var color = "blue"; } alert(color); |
for (var i = 0; i < 10; i++) { dosomething(i); //举例子 }; alert(i); |
对于有块级作用域的语言来说,for语句初始化变量的表达式所定义的变量只会存在循环环境中 |
4.2.2.1 声明变量
使用var声明的变量会自动被添加到最近的环境中。如果初始化变量时没有使用var声明,该变量就会被添加到全局环境中。
function add(num1 , num2){ var sum = num1 + num2; return sum; } var result = add(20 , 30); alert(sum); |
function add(num1 , num2){ sum = num1 + num2; return sum; } var result = add(20 , 30); alert(sum); |
4.2.2.2 查询标识符
var color = "blue"; function getcolor(){ return color; } alert(getcolor()); //blue |
var color = "blue"; function getcolor(){ var color = "red"; return color; } alert(getcolor()); //red |
4.3 垃圾收集
javaScript具有自动收集垃圾机制
4.3.1 清除标记 (最常用的垃圾收集方法)
4.3.2 引用计数
4.3.3 性能问题
4.3.4 管理内存
4.4 小结
javaScript变量可以保存两种类型的值:基本类型值和引用类型值。基本类型值源自于一下5种基本数据类型:Undefined、Null、Bollean、Number、String。基本类型值和引用类型值具有以下特点:
1、基本类型值在内存中占据固定大小的空间,所以被保存在栈内存中;
2、从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;
3、引用类型的值是对象,保存在堆内存中;
4、包含引用类型值的变量实际上包含的并不是对象本身,复制的其实是指针,因此两个变量最终都指向同一个对象;
5、确定一个值是那种基本类型可以使用typeof操作符,确定一个值是那种引用各类型可以使用instanceof操作符;
所有变量(包括基本类型和引用各类型)都存在一个执行环境中(作用域)。这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。下面是关于执行环境的总结:
1、执行环境有全局执行环境(全局环境)和函数执行环境之分;
2、每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链;
3、函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其父级远景,甚至全局环境;
4、全局环境只能访问在全局环境中定义的变量和函数,不能直接访问局部环境中的任何数据;
5、变量的执行环境有助于确定应该合适释放内存。
注:图片不能直接复制上来,回去再一张张上传吧。
版权声明:未经作者同意,不得私自转载。http://www.cnblogs.com/lal-fighting/
js004-变量、作用域和内存问题的更多相关文章
- 第一百零六节,JavaScript变量作用域及内存
JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...
- JavaScript变量作用域和内存问题(二)
执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后 ...
- js 变量 作用域及内存
由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...
- 浅谈javascript中变量作用域和内存(1)
先理解两个概念:基本类型和引用类型的值 1.基本类型和引用类型的值 (1)定义: 基本类型:指简单的数据段,比如按值访问的js五种基本数据类型undefined.null.boolean.number ...
- 浅谈javascript中变量作用域和内存(2)
1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...
- js基础之--变量 作用域和内存问题
基本类型:Undefind Null Boolean Number String 引用类型: 对象 在操作对象时,实际上实在操作对象的引用而不是实际的对象.为此,引用类型的值是按引用访问的. 从一个变 ...
- 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题
5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这 ...
- javascript高级程序设计第3版——第4章 变量作用域以及内存
- js学习之变量、作用域和内存问题
js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...
- JavaScript 中变量、作用域和内存问题的学习
这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...
随机推荐
- [转]mysql免安装版配置
现在mysql有一个installer,相当于安装包管理器.包含mysql的各个组件,比如workbench,各个语言的connector.十分方便,不用就可惜了.实在没有必要下载zip版,自己配置. ...
- git--- 拉取代码
- T3 任职定级面试准备
山东大学计算机专业本科毕业,工作8年,以前在华为工作,来YY正好1年. 个人心态开放积极,对未知事物好奇心很强,前沿科学.古老宗教皆有涉猎.英语口语能力较强,能和老外流程的交流.技术涉猎广泛,喜好研究 ...
- QMenu,contextmenuevent,窗体透明
void MainWindow::contextMenuEvent(QContextMenuEvent *event) { QMenu *menu=newQMenu; menu->addActi ...
- 利用springframework+javax.mail发邮件(普通邮件、带附件邮件、HTML格式邮件)
Spring提供了发送电子邮件的支持,可以发送普通邮件.带附件邮件.HTML格式邮件,甚至还可以使用Velocity模板定制化邮件内容. 一.引入相关的库 1 2 3 4 5 6 7 8 9 10 1 ...
- ES6新特性:利用解构赋值 (destructuring assignment), 简化代码
本文的Demo的运行环境为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用 : 解构赋值是一种表达式, 利用这种新语法, 可以直接从数组或者对象中快速提取值 赋值给不 ...
- python 进程间共享数据 (三)
Python的multiprocessing模块包装了底层的机制,提供了Queue.Pipes等多种方式来交换数据. 我们以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Q ...
- bzoj4429: [Nwerc2015] Elementary Math小学数学
先把所有可能的答案算出来,每个算式一个点,每个结果一个点,然后如果一个算式能算出一个结果,那么就连一条边 然后跑匈牙利,没有完美匹配就是impossible 每个算式最多有3个结果,所以边数是O(n) ...
- PHP热身
0.环境说明 win10 xampp phpstorm xampp带了apache和mysql以及phpmyadmin 1.配置mysql:修改默认编码 关mysql xampp/mysql/bin/ ...
- Mvc action间的传值
1, Mvc action间的传值? TempData["student"] ="123" 在<走入asp.net mvc不归路>系列文章5中,介绍 ...