javascript第四弹——变量、作用域、内存
一、变量
定义
变量是松散型的
变量是保存特定值的一个名字
变量包含两种数据类型的值:基本数据类型的值和引用数据类型的值
基本数据类型值
基本数据类型值是一个简单的数据段,在内存中占用固定的空间,保存在栈内存中,当复制基本数据类型值的时候,js会创建一个当前值的副本,复制和被复制的值是完全独立的
引用数据类型值
引用数据类型值是多个值构成的对象,保存在堆内存中,引用数据类型的值是可以动态添加属性和方法的,当复制引用数据类型值的时候,复制的是一个内存地址(指针),复制的值和被复制的值都指向存储在堆内存中的同一个对象,包含引用数据类型值的变量其实包含的不是对象本身,而是该对象的内存地址,操作的是对象的引用的内存地址,而不是对象本身
访问变量
访问变量是按照值类型访问或者引用类型访问,值访问是直接查找栈内存中是否有这个值,引用类型访问是通过对象的内存地址查找保存在堆中的这个对象中是否有这个值。
传递变量
js中的参数传递只能是值传递,参数传递的过程其实就是值复制的过程,如果传递的参数是一个对象,那么就会把实参(对象)的内存地址复制给形参,这个内存地址是一个值,在作用域内形参的属性值发生变化后,实参的属性值也会发生变化。在这个过程中变量的值得类型是引用类型,但是传递的参数是一个值(内存地址),所以参数传递是值传递。
二、作用域
- 每一个作用域都有一个与之关联的变量对象,作用域中定义的变量和函数都会保存在这个对象中
- 所有变量都存在于某一个作用域中,作用域决定了变量的生命周期
- 作用域分为全局作用域和函数作用域(局部作用域)
- 局部作用域能访问本身作用域中的变量,也能访问父级作用域和全局作用域
- 全局作用域只能访问全局作用域中定义的变量和函数,不能直接访问局部作用域中的任何数据
- 变量的作用域有助于确定何时释放内存
- 每一个作用域都有一个用于搜索变量和函数的作用域链
- 某些语句可以在作用域链前端临时添加一个变量对象来延长作用域链,该变量对象会在代码执行后被移除。
- 在js文件中引用另外一个js文件中的变量也会延长作用域链
- js没用块级
三、内存
js具有自动垃圾回收机制,js所用的垃圾收集方式是标记清除,垃圾收集器在运行时,会给存储在内存中的所以变量加上标记,然后他会去掉作用域中的变量以及被作用域中的变量引用的变量的标记,而在此之后再被加上标记的变量而被视为将要删除的变量,原因是作用域中的变量已经无法访问到这些变量了。
解除引用可以确保有效的回收内存,数据不再有用时,最好释放其内存。
javascript第四弹——变量、作用域、内存的更多相关文章
- javascript第四课变量作用域
局部变量: function f1() { var n1=0; //局部变量 n1=10; //全局变量,当前页面均可调用 } n1=10;//全局变量 var n1=10;//全局变量 在方法内的 ...
- JavaScript解析顺序和变量作用域
JavaScript基础之变量作用域. 一. 1.全局变量:全局变量的意思就是,在代码的不论什么地方都能够訪问到.注意:未定义 直接赋值的变量拥有全局属性. 2.局部变量:局部变量的意思就是,变量的作 ...
- JavaScript(四)变量
变量的声明 在JavaScript程序中,使用一个变量之前应当使用关键字var进行声明,如下所示:var num;var sum; 也可以写成var num,sum,avg;如果只是声明变量而没有给变 ...
- javaScript的闭包 js变量作用域
js的闭包 js的变量作用域: var a=90; //定义一个全局变量 function test(){ a=123; //使用外层的 a变量 } test(); document.write(&q ...
- 《JavaScript 高级程序设计》读书笔记四 变量 作用域 内存
一 变量(基本类型和引用类型) a.基本类型保存值,保存在栈内存,引用类型保存指针,保存在堆内存: b.所有函数的参数都是按值进行传递的,不管参数是何种类型: c.检测类型 typeof ...
- 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题
5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这 ...
- javascript笔记整理(变量作用域)
变量的作用域(作用域:指的就是一段代码的作用范围) 一.变量的作用域 1.全局变量(在代码中任何地方都能够访问得到的变量,拥有全局的作用域) A.最外层函数外面定义的变量 var a=1; funct ...
- JavaScript中的垃圾回收和内存泄漏
摘要: JS内存管理. 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有. 前言 程序的运行需要内存.只要程序提出要求,操作系统或者运行时就必须供给内存.所谓的内存泄漏简单来说是不再用到的 ...
- javascript高级程序设计第四章 变量、作用域和内存问题
变量包含两种,,基本类型和引用类型 基本类型是指一些简单的字段: 引用类型是☞由多个值构成的对象 引用类型的值是保存在内存中的对象,在javascript中是不允许直接访问内存中的位置; 函数的参数 ...
随机推荐
- Having与Where的区别
where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行. having 子句的作用是筛 ...
- VMware的四种网络连接方式
mkdir /mn/cdrom mount /dev/cdrom /mnt/cdrom Bridge:这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两个不同地址类 ...
- 【系统】CentOS、Ubuntu、Debian三个linux比较异同
CentOS.Ubuntu.Debian三个linux比较异同 2014-07-31 12:58 53428人阅读 评论(6) ...
- 《ASP.NET1200例》统计网站访问量源代码
void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 int count=0; ...
- Convert Sorted Array to Binary Search Tree With Minimal Height
Given a sorted (increasing order) array, Convert it to create a binary tree with minimal height. Exa ...
- #define 的一些用法 以及 迭代器的 [] 与 find()函数的区别
#include "stdafx.h" #include <map> #include <string> #include <iostream> ...
- 使用eclipse开发Java web应用
前面说了手动配置一个应用,手动配置可以更深入的理解web应用的分布,但是一般的编辑器没有语法错误提示,所以开发起来对于错误的寻找不太容易,效率相对较低,所以在理解清楚web项目的结构之后,我们使用ec ...
- List对象分组排序算法
场景: List里面的对象是订单的节点,比如我们快递的物流状态,这个是需要有序的,所以需要根据订单号进行分组排序. import java.util.ArrayList; import java.ut ...
- 使用webstorm操作git
0. 前言 在上一篇文章中,讲述了使用webstorm去调试node程序,最近研究了一下如何使用webstorm去操作git. 对于git的使用,大家的使用方式均有不同,最王道的方式非命令行莫属,基于 ...
- 【读书笔记】读《高性能JavaScript》
这本<高性能JavaScript>讲述了有关JavaScript性能优化的方方面面,主要围绕以下几个方面: 1> 加载顺序 2> 数据访问(如怎样的数据类型访问最快,怎样的作用 ...