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来释放其引用。
这个方法叫解除引用。适合大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动解除。
JS学习笔记(二)变量、作用域及内存问题的更多相关文章
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- python3学习笔记12(变量作用域)
变量作用域 参考http://www.runoob.com/python3/python3-function.html Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量 ...
- Python 3 学习笔记之——变量作用域、模块和包
1. 变量作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python 的作用域一共 ...
- [转]node.js学习笔记(二)
二.express 1.安装 express4 npm --registry=http://registry.npmjs.org install -g express-generator (全局) 2 ...
- Node.js学习笔记(二) --- CommonJs和Nodejs 中自定义模块
一. 什么是 CommonJs? JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器. 然而, JavaScript标准定义的 API 是为了构建基于浏览器的应用程序.并没有制定一 ...
- 【转】require.js学习笔记(二)
require.js遵循AMD规范,通过define定义模块,require异步加载模块,一个js文件即一个模块. 一.模块加载require1.加载符合AMD规范模块 HTML: <scrip ...
- vue.js学习笔记(二)——vue-router详解
vue-router详解 原文链接:www.jianshu.com 一.前言 要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用<a></a> ...
- vue.js学习笔记(二):如何加载本地json文件
在项目开发的过程中,因为无法和后台的数据做交互,所以我们可以自建一个假数据文件(如data.json)到项目文件夹中,这样我们就可以模仿后台的数据进行开发.但是,如何在一个vue.js 项目中引入本地 ...
- angular.js学习笔记(二)
1.安装core ,shared模块 ng g m core ng g m shared 2.在shared中导入core模块 core模块只加载一次所以将公共组件放到core中 3.创建公共组 ...
- Go语言学习笔记(二) [变量、类型、关键字]
日期:2014年7月19日 1.Go 在语法上有着类 C 的感觉.如果你希望将两个(或更多)语句放在一行书写,它们 必须用分号分隔.一般情况下,你不需要分号. 2.Go 同其他语言不同的地方在于变 ...
随机推荐
- Shell记录-Shell命令(磁盘)
inux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式 df [选项] [文件] Shell ...
- mq使用场景、不丢不重、时序性
mq使用场景.不丢不重.时序性.削峰 参考: http://zhuanlan.51cto.com/art/201704/536407.htm http://zhuanlan.51cto.com/art ...
- NOIP2012 提高组 Day 1
期望得分:100+100+70=270 实际得分:100+50+70=220 T2 没有底 最后剩余时间来不及打高精.思路出现错误 T1 Vigenère 密码 题目描述 16 世纪法国外交家 Bla ...
- Java并发编程原理与实战四十五:问题定位总结
背景 “线下没问题的”. “代码不可能有问题 是系统原因”.“能在线上远程debug么” 线上问题不同于开发期间的bug,与运行时环境.压力.并发情况.具体的业务相关.对于线上的问题利用线上 ...
- python核心编程笔记——Chapter8
Chapter8.条件和循环 这一章感觉有用的点并不多,在我眼里就只有迭代器,列表解析和生成器表达式值得研究而已. 8.2.循环,难度不大. #!usr/bin/env python #-*-codi ...
- 【leetcode 简单】 第九十六题 最长回文串
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字符串的长度不 ...
- javascript中用闭包递归遍历树状数组
做公司项目时,要求写一个方法,方法的参数为一个菜单数组集合和一个菜单id,菜单数组的格式为树状json,如下面所示: [{"id":28,"text":&quo ...
- Linux的bg和fg命令 ---让程序在前台后台之间切换
Linux的bg和fg命令 我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让程序在前台后台之间切换.而 Linux 提供了 fg 和 bg 命 ...
- 事件,使用.net自带委托EventHandler
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- html 列表标签
1.有序列表 <ol> <li>你好</li> <li>你好</li> <li>你好</li> </ol> ...