JS学习笔记(二)变量、作用域及内存问题
一、基本类型和引用类型的值
变量可能包含两种不同数据类型的值:基本类型值和引用类型值。
基本类型值:简单的数据段。
引用类型值:可能由多个值构成的对象。
当将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值。
引用类型的值是保存在内存中的值。JavaScript不允许直接访问内存中的位置,即不能直接操作对象的内存空间。
当复制保存着对象的某个变量时,操作的是对象的引用。在为对象添加属性时,操作的是实际的对象。
1、动态的属性
对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法。
2、复制变量值
当从一个变量向另一个变量复制基本类型的值时,会在变量对象上创建一个新的值,然后把该值复制到为新变量分配的位置上。
当一个变量向另一个变量复制引用类型的值,同样会将存储在变量对象中的值复制一份放到位新变量分配的内存空间中。但是这个副本实际上是一个指针,指向存储在堆中
的一个对象。两个变量实际上引用一个对象。
3、传递参数
访问变量有按值传递和按引用传递两种方式,参数只能按值传递。
在向参数传递基本类型的值时,被传递的值会赋给一个局部变量。
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数外部。
4、检测类型
typeof操作符可以确定一个变量是字符串、数值、布尔值,还是undefined。
instanceof操作符可以判断一个值是什么类型的对象。
语法:result = variable instanceof constructor
例如:person instanceof Array //判断person是Array吗?
二、执行环境
执行环境定义了变量或函数有权访问的其他数据,决定他们各自的行为。每个执行环境中都有一个与之对应的变量对象,环境中定义的所有函数和对象都保存在这个对象中。
全局执行环境是最外围的一个执行环境。在Web浏览器中,全局执行环境被认为是window对象。
所有的全局变量和函数都是作为window对象的属性和方法创建的。
某个执行环境中所有的代码执行完毕,该环境被销毁,保存在其中的所有函数和变量也随之销毁。
每个函数都有自己执行环境。
当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,函数执行之后,栈将其环境弹出,把控制权返回给之前的环境。
当代码在一个环境中执行时,会创建一个变量对象的一个作用域链。
作用域链的用途是保证执行环境有权访问的所有变量和函数的有序访问。
作用域链的前端始终是当前执行的代码所在环境的变量对象。
标识符解析是沿着作用域链一级一级搜索标识符的过程。
1、延长作用域链
2、没有块级作用域
JavaScript中没有块级作用域
1.声明变量
使用var声明的变量会自动的添加到最接近的环境中。在函数内部,最接近的环境就是函数的局部环境。如果初始化变量没有使用var声明,该变量会自动添加到全局环境中。
建议在初始化变量之前一定先声明。
2.查询标识符
当在某个环境中为了读取或写入而引用一个标识符时,必须通过搜索来确定该标识符实际代表什么。
搜索过程从作用域链的前端开始,向上逐级查询与给定的名字匹配的标识符。如果在局部环境中找到了该标识符,搜索结果停止,变量就绪。在局部中没有改标识符的话,继续沿作用域链向上搜索。直到全局环境的变量对象,还没有找到该标识符的话,该变量就未声明。
三、垃圾收集
垃圾收集机制原理:找出不再继续使用的变量,释放其占用的内存。垃圾收集机器会按照固定时间间隔周期性的去执行这一操作。
1、标记清除
垃圾收集器在运行时会给存储在内存中的所有变量加上标记(可以使用任何标记方式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。在此之后再被加上标记的变量将被视为准备删除的变量,因为环境中的变量无法访问这些变量了。
2、引用计数
类似于创建进程时的初始化计数。
引用计数:跟踪记录每个值被引用的次数,当变量被声明复制时,这个值的引用次数就是1。当引用次数变为0时,可将其占用的内存进行回收。
但是循环引用会导致内存无法回收。
为解决循环引用的问题,应在变量使用完毕之后将变量置为空(NULL)。
3、性能问题
垃圾收集例程
4、管理内存
分配给Web浏览器的可用内存数量通常比分配给桌面应用程序的少。目的是防止运行JavaScript的网页耗尽全部系统内存而导致系统崩溃。
内存限制会影响给变量分配内存,还会影响调用栈以及在一个线程中能够同时执行的语句的数量。
因此,为了让页面获得更好的性能,在数据不再使用之后,将其值设置为NULL来释放其引用。
这个方法叫解除引用。适合大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动解除。
转载于:https://www.cnblogs.com/suvllian/p/5477662.html
JS学习笔记(二)变量、作用域及内存问题相关推荐
- Vue.js 学习笔记 二,一些输出指令
Vue的一些输出指令 {{字段}},v-text指令,v-html指令 <html> <head><meta name="viewport" cont ...
- JS学习笔记二——JavaScript 基础知识
JavaScript 基础知识 一.JavaScript 变量 二.JavaScript 的输出 三.JavaScript 运算符 四.结语 一.JavaScript 变量 变量是指在程序运行过程中, ...
- php学习笔记0001 变量作用域
<?php /* 2015-8-6 php学习笔记0001 函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问. 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行 ...
- javascript权威指南 学习笔记之变量作用域
最近一直在看<javascript权威指南 第五版>,变量作用域这一章,看得真的有点累.不过,收获还是多多. 不知道,大家对语言中变量的"声明"与"定义&qu ...
- JS学习笔记二 DOM,正则表达式简单例子介绍
一.正则表达式 例子: var patt = /w3school/i; 例子解释: /w3school/i 是一个正则表达式. w3school 是模式(pattern)(在搜索中使用). i 是修饰 ...
- PowerBuilder学习笔记(变量作用域)
变量的作用域不同,可分为四种: 全局变量(Global Variable): 作用域为整个应用程序. 实例变量(Instance Variable): 在特定的对象中,随着对象的打开.关闭而创建和删除 ...
- JS学习笔记5-JavaScript 变量
一个好的编程习惯是,在代码开始处,统一对需要的变量进行声明. 一条语句,多个变量 您可以在一条语句中声明很多变量.该语句以 var 开头,并使用逗号分隔变量即可: var lastname=" ...
- node.js学习笔记(二):核心
NodeJS核心东西随着版本更新越来越多,详情看官方文档:http://nodejs.org/api/ 下面简单介绍几个用的比较多的 1.全局对象 在浏览器JavaScript 中,通常windo ...
- Vue.js 学习笔记 一
上手前的一些概念 为啥要用Vue.js Vue.js 是目前最流行的前端框架之一,专注于视图层,容易上手. 使用Vue.js,通过框架提供的指令可以减少很多DOM操作(数据的双向绑定),提高渲染效率, ...
- Vue.js 学习笔记三,一些基础指令,v-bind,v-on
在笔记二的基础上继续写 v-bind指令,为属性绑定数据 <!--v-bind指令可以绑定属性--><div v-html="msg2" v-bind:title ...
最新文章
- Flask 启动配置
- Linux ssh/scp/docker学习
- Centos学习笔记之grep命令
- Linux开机启动过程(5):内核解压
- 物联网卡11位和13位号码的区别在于哪
- html css 怎么使img和a标签在一个行内元素中间对齐
- Jenkins手动更新AWS 上面的ECS服务
- 基于Vue+nodejs+Web的网上书城系统
- PB系统连接原生数据库DB文件
- 上周回顾:DNS漏洞被泄 华为辞职门再起风波
- 触须避障程序(改进篇)
- Named Route ‘***‘ has a default child route. When navigating to this named route
- 西安交通大学城市学院的计算机类专业,西安交通大学城市学院计算机系2020级专业分流会...
- C语言取模运算符的妙用
- 2876: [Noi2012]骑行川藏
- CC2530—MQ-2气敏式烟雾传感器
- CSS transform属性
- php相册管理插件,相册插件-ZBLOGPHP插件-鸟儿网络
- 电脑各种中英文信息对照及错误信息总汇 【维修电脑 最佳收藏资料】
- linux服务器设置jar包开机自启动
热门文章
- js split参数为无效字符_互联网前端开发技术JavaScript字符串类型详解
- Vue+Vue Router+Vuex页面演示
- Python的for循环显示每个元素的下标
- 飞桨模型保存_史上最全解读 | 飞桨模型库重大升级 主流算法模型全覆盖
- 20200713:动态规划复习day04
- 20190914:(leetcode习题)验证二叉搜索树
- 海洋zyapi.php,zyapi.php · 姬晓亮/海洋cms 海洋影视管理系统 - 免费开源PHP - Gitee.com...
- android打开相机拍照及打开相册选择照片
- VB 二进制数组与十六进制字符串相互转换
- Linux命令速查手册