《js高程》笔记总结二(变量,作用域,内存问题)
理解基本类型和引用类型的值,理解执行环境,理解垃圾收集
基本类型的值和引用类型的值
基本类型
:简单的数据段,引用类型
:指可能由多个值构成的对象(在将一个值赋值的时候,解析器必须知道这个值是基本类型值还是引用类型值)- 复制变量值
- 在基本类型中
var num1=5;
var num2=num1;
其中num1和num2是完全独立的,各自都占用内存
- 在引用类型中
var obj1=new Object();
var obj2=obj1;
obj1.name="xiaoh"
alert(obj2.name) //xiaoh
obj1和obj2知识拥有不同的索引值,但是他们都是指向同一个对象
- 在基本类型中
- 参数的传递
- 可以把js中参数想象成一个局部变量
- 当传递值基本类型的值时,被传递的值被复制了一份给局部变量(参数)
function addTen(num){
num+=10;
return num;
}
var count=20;
var result=addTen(count);
alert(count); //20 ,没有变化
alert(result); //30
- 当传递引用类型的值时,会把这个值在内存中的地址复制一个给局部变量(参数)
function serName(obj){
obj.name="xiaoming"
}
var person = new Object();
setName(person);
alert(person.name); //"xiaoming"
==================================
function setName(obj){ //此时obj只得到了索引
obj.name = "xiaohuang"; // .属性 ,改变了对象的值
obj=new Object(); //obj得到了新对象的索引,不再指向原来的对象
obj.name ="greg" //改变的是索引指向的新对象的属性
}
var person=new Object();
setName(person);
console.log(person.name); //小黄
console.log(obj.name)
引用类型检测
在检测数据类型的时候,typeof是非常得力的助手,但是引用类型的时候,我们经常并不是想知道他是不是对象,更多的想知道他是什么类型的对象。此时就有了instanceof操作符
- alert(person instanceof Object) //变量person是Object吗
- alert(colors instanceof Array) //同上
- alert(pattern instanceof RegExp) //同上
执行环境及作用域
执行环境:定义了变量或函数有权访问的其他数据,决定了他们各自的行为
作用域:一段代码中的名字并不总是有效的,而限定这个名字的可用性代码范围就是这个名字的作用域。
- 提高了程序的逻辑和局部性,为代码的模块化开发提供遍历
- js代码中的作用域有哪些缺陷:没有块级作用域for循环中定义的变量(i,j,a,b)可以被外部访问,所以js代码中for循环定义变量的时候都不写在for循环里面,还有if语句中{}声明的变量名也是一样
- 我们可以使用函数作用域和自执行函数来模拟作用域
作用域连
- 保证变量在执行环境下的有序访问
var name = "global";
function super() {
var name = "super";
function sub(){
var name = "sub";
}
}
当前作用域链:全局变量对象window -> 变量对象super —> 活动对象sub (从最底端向上访问)
延长作用域链
- 使用with语句
垃圾收集
函数中的局部变量生命周期
- 局部变量只在函数的执行过程中存在,在这个过程中。会为局部变量分配相应的空间,在函数结束,就释放他们的内存。
标记清除
- 进入环境的时候,标记"进入环境",离开环境的时候(如return)标记为"离开环境"
- 释放内存的简单例子,var a =1; a=null;
- 1.垃圾回收器会给内存中的变量都加上标记 2.去掉环境中的变量以及被环境中变量引用的变量的标记 3.在此之后在被加上标记的变量讲被视为准备删除的变量,原因是环境中的变量已经访问不到这些变量了(抽象例子 var a=1 ,var b=2 ,a=b)
引用标记
官话:当申明了一个变量并将一个引用类型赋值给该变量是,则这个的引用次数加1,如果同一个值又被赋给另一个变量,则该值的引用次数再加1,相反,如果包含对这个值引用的变量又取得了另一个值则减1,到0的话,就没有办法访问这个值了,则清除回收内存
用伪代码案例来演示官方说明:
var a = new obj1 (obj1引用1)
var b=a (obj1引用2)
b = c(c指其他值 ,obj1引用-1)
a= c( obj1引用-1)
//此时obj1引用为0,已经没有变量能访问这个值了,则清除回收
引用标记的致命缺陷:循环引用,你的属性引用我,我的属性引用你。这样双方的引用次数都为2,永远不会被清除
管理内存
- 使用具备垃圾回收机制的语言编写程序,开发人员一般不必操心内存管理的问题,但是,js有些不同,最主要的问题就是分配给web浏览器的可用内存数量通常比分配给桌面应用程序的少,这样做的目的主要出于安全考虑,防止运行js的网页耗尽全部系统内存而导致系统崩溃,内存问题不仅会影响给变量分配内存,同时还会影响调用栈以及在一个线程中能够同时执行的语句数量
- 优化内存占用的最佳方式就是,代码中只保存必要的数据,一旦数据不再用就将其值设置成null来释放内存,这个叫解除引用,大多数适用于全局变量和全局对象的属性,局部变量会在他们离开执行环境时自动被解除引用。
总结
- 每次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链(只能从下往上访问),函数的局部变量(下端)不仅有权访问函数作用域中的变量,还能访问其父环境,乃至全局环境,而全局环境(上端)只能访问全局环境中定义的变量和函数。
《js高程》笔记总结二(变量,作用域,内存问题)的更多相关文章
- JS学习笔记(二)变量、作用域及内存问题
一.基本类型和引用类型的值 变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值:简单的数据段. 引用类型值:可能由多个值构成的对象. 当将一个值赋给变量时,解析器必须确定这个值是基 ...
- JS三座大山再学习(二、作用域和闭包)
原文地址 作用域 JS中有两种作用域:全局作用域|局部作用域 栗子1 console.log(name); //undefined var name = '波妞'; var like = '宗介' c ...
- JS高阶---数据、变量、内存
[一]基础 (1)什么是数据? 存储在内存里 代表特定信息 本质为0101,二进制数据 (2)什么是内存? 内存条通电后产生的可存储数据的空间(临时的) 拓展: 1.2种数据 2.内存分类--栈和堆 ...
- 【转】Backbone.js学习笔记(二)细说MVC
文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...
- D3.js学习笔记(二)——使用绑定在DOM上的数据
简单例子 在这个例子中,你将会使用D3.js来将数据绑定到DOM元素上.然后再使用D3.js利用绑定到DOM元素上的数据来更新网页. 在上一章中,我们以下面这个页面作为开始的: <!DOCTYP ...
- js高程 第 4章 变量、作用域和内存问题 【笔记】
4.4 小结 JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下 5 种基本数据类型:Undefined.Null.Boolean.Number 和 Str ...
- js学习笔记1(变量、作用域、内存)
写在前面,舍弃叽叽歪歪,只做学习笔记,认真踏实. 学习书籍:javascript高级程序设计3版. 章节4.1 基本类型和引用类型 1.基本类型在内存中占据固定大小的空间,所以保存在栈内存中. 2.从 ...
- JS 作用域(执行环境)与作用链---JS 学习笔记(二)
一 作用域(执行环境) 作用域:定义了变量和函数有权访问的其他数据,决定了他们各自的行为.--------<JS高级程序设计>4.2 好难理解啊~参考了参考尤克希的博客内容,大体上理解了 ...
- 《JavaScript 高级程序设计》读书笔记四 变量 作用域 内存
一 变量(基本类型和引用类型) a.基本类型保存值,保存在栈内存,引用类型保存指针,保存在堆内存: b.所有函数的参数都是按值进行传递的,不管参数是何种类型: c.检测类型 typeof ...
- javascirpt怎样模仿块级作用域(js高程笔记)
因为javascript没有块级作用域的概念,所以在块语句中定义的变量,实际上是在包括函数中而非语句中创建的. 如: function outputNumbers(count){ for(var i= ...
随机推荐
- 【RTOS】基于V7开发板的RTX5和FreeRTOS带CMSIS-RTOS V2封装层的模板例程下载,AC6和AC5两个版本
说明: 1.使用MDK的RTE环境开发RTX5和FreeRTOS,简单易移植,统一采用CMSIS-RTOS V2封装层. 2.DTCM是H7里面性能最高的RAM,主频400MHz,跟内核速度一样,所以 ...
- 深度学习VGG16模型核心模块拆解
原文连接:https://blog.csdn.net/qq_40027052/article/details/79015827 注:这篇文章是上面连接作者的文章.在此仅作学习记录作用. 如今深度学习发 ...
- Java 添加Word页眉、页脚
本篇文章将介绍通过java程序来添加Word页眉页脚的方法.鉴于在不同文档中,对页眉页脚的操作要求不同,文章将分别从以下几种情况来阐述: 1.添加页眉页脚 添加图片到页眉 添加文本到页眉 添加页码 2 ...
- Linux下Mysql安装教程详解
Linux下软件安装一般有三种方式:RPM包方式(通过Redhat 第三方包管理系统).二进制包和源码包.本篇主要介绍二进制包安装mysql数据库的方式. 如何获取二进制源码包 当然是到mysql官网 ...
- IdentityServer4 常见问题 - 用户拒绝授权后报错
1.问题说明 在 IdentityServer4 Web 授权中,一般会有一个显示客户端需要获取用户的那些信息的页面,询问用户是否同意: 在这个页面如果我们点击"No, Do Not All ...
- Java生鲜电商平台-电商起送价的深入思考与实战
Java生鲜电商平台-电商起送价的深入思考与实战 说明:在生鲜电商中,起送价是一个非常普遍的话题,今天我们就用实战来告诉大家,如何设置起送价,如何编写起送价的代码,以及如何同步起送价. 在开始题目之前 ...
- SAP 固定资产添加新类别
需求:添加资产新类别(LEASE) 步骤: 1.添加 Account determination ①SPRO->Financial Accounting(New)->Asset Accou ...
- 【转载】Android Context 到底是什么?
什么是Context? 一个Context意味着一个场景,一个场景就是我们和软件进行交互的一个过程.比如当你使用微信的时候,场景包括聊天界面.通讯录.朋友圈,以及背后的一些数据. 那么从程序的角度来看 ...
- 查找 oracle 数据库中包含某一字段的所有表的表名
select table_name from DBA_TAB_COLUMNS where COLUMN_NAME='字段名'; 字段名需要大写
- 【Java基础】Java中的反射机制
一.反射的理解 (1)正射 在理解反射这个概念之前,我们先来理解Java中的“正射”. 我们在编写代码时,当需要使用到某一个类的时候,必定先会去了解这是一个什么类,是用来做什么的,有怎么样的功能. 之 ...