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中是不允许直接访问内存中的位置; 函数的参数 ...
随机推荐
- 隐藏Nginx/Apache版本号的安全性与方法
一.先介绍nginx隐藏版本号的方法. 搭建好nginx或者apache,为了安全起见我们都会隐藏他们的版本号,这边讲的是nginx的版本号,如果你也想隐藏apache的版本号,那请点前面的链接.请看 ...
- 【Docker】来自官方映像的 6 个 Dockerfile 技巧
本文将根据我从官方镜像学到的经验,讲解编写Dockerfile的技巧. 1. 选择Debian 官方镜像的大多数Dockerfile,不管是直接还是通过其他镜像,都是基于Debian的.Dock ...
- Burst Balloons
Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...
- ListBox1控件
前台: <div> <asp:ListBox ID="ListBox1" runat="server" AutoPostBack=" ...
- placement new讲解
[本文链接] http://www.cnblogs.com/hellogiser/p/placement-new.html [分析] 首先我们区分下几个容易混淆的关键词:new.operator ne ...
- 如何提高cocos2d-x-spine骨骼动画加载速度
下面分2点来说: 1. 时间消耗点:io和现场解析 解决方案:加载过的骨骼动画就不要每次重新加载,不要每次都去加载json文件和atlas,我推荐使用 static CCSkeletonAnimati ...
- PHP+七牛云存储上传图片代码片段
2014年11月14日 16:37:51 第一段代码是上传单个图片的,第二个是上传多个图片的 //上传到七牛 //单个文件 //formname: 表单名字; pre: 图片Url中显示的图片名字(也 ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib
今天在linux里安装mysql,运行时遇到这样的错误 ERROR 2002 (HY000): Can't connect to local MySQL server through socket ' ...
- 【JAVA、C++】LeetCode 001 Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- HDU1717小数化分数2
小数化分数2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...