Javascript高级程序设计第四章 | ch4 | 阅读笔记
变量、作用域与内存
原始值与引用值
什么是字面量形式?
let obj = {
key1: val1,
key2: val2,
foo () {
}
}
这就是字面量形式,手动声明一个对象的属性和方法,而不是通过构造函数。这样声明简单,但不能复用。 引用
-> 原始类型初始化只能使用字面量形式
复制值
原始值和引用值在变量复制时也有差别
1. 原始值的复制是拷贝
2. 引用值的复制实际上是指针的拷贝
传递参数
ECMAScript中参数传递只有按值传递,它的参数就是局部变量
- 如果是原始值则拷贝
- 如果是引用值则拷贝指针
-> 这就导致在局部作用域中修改obj的属性值,也会影响到外部。因为拷贝的引用是指向堆内存的
确定类型
- typeof:适用于判断变量是否为原始类型。特别是变量是否为字符串、数值、布尔值或undefined。如果是null,那么typeof就会返回object。typeof对于所有对象都返回object
- instanceof:如果想知道一个变量是什么类型的对象,可以用instanceof方法
执行上下文与作用域
变量和对象的上下文决定了它们能够访问哪些数据,以及它们的行为。每个上下文都有一个关联的变量对象,而这个上下文中定义的所有变量和函数都存于这个对象上。
全局上下文是最外层的上下文(window,global)
使用let和const的顶级声明不会定义在全局上下文中
当函数执行时,函数的上下文会被推到上下文栈顶,等函数执行结束,就会从上下文栈中弹出。
上下文中的代码在执行的过程中会创建变量对象的一个作用域链。这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。
function layer_1() {
let color = 'red';
function layer2() {
console.log(color);
}
layer2();
}
layer_1(); // red
//-------------------------------------------------------------------//
let color = 'blue';
function layer2() {
console.log(color);
}
function layer_1() {
let color = 'red';
layer2();
}
layer_1(); // blue
// 也就是说函数执行的时候的上下文是与函数定义位置的上下文相关的。
如果这里把layer2的定义放到外面就会报错
函数参数被认为是当前上下文中的变量,因此也跟上下文中的其他变量遵循相同的访问规则
作用域链增强
- try/catch语句的catch块
- with语句
变量声明
- 使用var声明的变量会被自动添加到最接近的上下文,如果未经定义就被初始化了会被添加到全局上下文。
- var声明会被拿到函数或者作用域的顶端,在作用域所有代码之前。这个现象叫做:“提升”。提升让同一作用域中的代码不必考虑变量是否已经声明就可以使用。
console.log(age); // undifined
var age = 1;
- 使用let块级作用域声明。块级作用域由最近的一对包含花括号* { } * 界定。
- let与var的不同之处:
- 重复的var声明会被忽略,不会报错
- 重复的let声明会报错
- 使用var声明的循环迭代变量会泄露到循环外部
- let声明的变量会有暂时性死区,即在声明前调用会报错
- 使用const声明的变量必须同时赋值,且在其生命周期中不能再重新赋值。其余与let变量相同。
- const保存的对象虽然引用不能改变,但是属性不受限制。
- 如果希望整个对象都不能修改,可以使用Object.freeze()
- 使用标识符查找
垃圾回收
垃圾回收的基本思路:确定哪个变量不再使用之后,释放它占用的内存。这个过程是周期性的,垃圾回收程序每隔一定时间就会自动运行。
标记未使用的变量:
- 标记清理
- 引用计数
标记清理
引用计数
性能
内存管理
使用let和const会提高垃圾回收的性能
Javascript高级程序设计第四章 | ch4 | 阅读笔记的更多相关文章
- javascript高级程序设计第四章 变量、作用域和内存问题
变量包含两种,,基本类型和引用类型 基本类型是指一些简单的字段: 引用类型是☞由多个值构成的对象 引用类型的值是保存在内存中的对象,在javascript中是不允许直接访问内存中的位置; 函数的参数 ...
- javascript高级程序设计第三章的一些笔记
[TOC] 1. 语法 1.1 区分大小写 变量.函数名和操作费都区分大小写. 1.2 标识符 标识符指变量.函数.属性的名字,或者函数的参数.标识符按以下规则组合: 第一个字符必须是一个字母,下划线 ...
- 《JavaScript高级程序设计》——第二章在HTML使用JavaScript
这章讲的是JavaScript在HTML中的使用,也就是<script>元素的属性.书中详细讲了async.defer.src和type四个<script>的属性. 下面是对第 ...
- JavaScript高级程序设计学习(四)之引用类型
在javascript中也是有引用类型的,java同样如此. javascript常见也比较常用的引用类型就熟Object和Array. 一个对象和一个数组,这个在前后端分离开发中也用的最多.比如aj ...
- JavaScript高级程序设计第14章表单脚本 (学习笔记)
第十四章 表单脚本 1.阻止默认表单提交 1.提交表单数据 1.使用type=submit提交按钮 2.使用submit():方法 注意:当用户点击提交按钮时,会触发submit事件,从而在这里我们有 ...
- JavaScript高级程序设计学习(四)之引用类型(续)
一.Date类型 其实引用类型和相关的操作方法,远远不止昨天的所说的那些,还有一部分今天继续补充. 在java中日期Date,它所属的包有sql包,也有util包.我个人比较喜欢用util包的.理由, ...
- JavaScript 高级程序设计 第5章引用类型 笔记
第五章 引用类型 一.object类型 1.创建方法: 1.使用new 操作符创建 var person=new object() Person.name=”Nicholasa” Porson.age ...
- 《JavaScript 高级程序设计》第一章:简介
JavaScript 历史 JavaScript的诞生的主要是当时的 netspace 公司谋求为自己的浏览器 Navigator 添加一种脚本语言,以便在本地客户端进行一些行为操作,而这一功能的需求 ...
- JavaScript高级程序设计第20章JSON 笔记 (学习笔记)
第二十章 JSON 1.Json 可以表示三种类型的值: 1.简单值: 表示数值:5 表示字符串:“hello wrold”注表示字符串时必须使用双引号 2.对象: {“name”:“mi”,”ag ...
- 读书时间《JavaScript高级程序设计》四:BOM,客户端检测
隔了一段时间,现在开始看第8章. 第8章:BOM BOM提供了很多对象,用于访问浏览器的功能.BOM的核心对象是window,它表示浏览器的一个实例. window对象是通过javascript访问浏 ...
随机推荐
- 实时化或成必然趋势?新一代 Serverless 实时计算引擎
作者:高旸(吾与),阿里巴巴高级产品专家 本文由阿里巴巴高级产品专家高旸(吾与)分享,主要介绍新一代Serverless实时计算引擎的产品特性及核心功能. 一.实时计算 Flink 版 – 产品定位与 ...
- 【产品动态】解读Dataphin流批一体的实时研发
简介: Dataphin作为一款企业级智能数据构建与管理产品,具备全链路实时研发能力,从2019年开始就支撑可集团天猫双11的实时计算需求,文章将详细介绍Dataphin实时计算的能力. 背景 每当 ...
- 业界首个机密计算容器运行时—Inclavare Containers正式进入CNCF!
简介: Inclavare Containers 通过云原生计算基金会(CNCF)TOC 投票正式成为 CNCF 官方沙箱项目. 作者|彦荣 2021 年 9月 15 日,Inclavare C ...
- [ELK] 生产环境使用 Elasticsearch Docker 镜像的优化选项
[ 配置内核设置 vm.max_map_count 至少为 262144 ] https://www.elastic.co/guide/en/elasticsearch/reference/curre ...
- WPF 已知问题 Popup 失焦后导致 ListBox 无法用 MouseWheel 滚动问题和解决方法
本文记录在 Popup 失焦后导致 ListBox 无法用 MouseWheel 滚动问题 原因: Popup虽然是个完整独立的窗体,但它的激活要靠它的"父窗口"间接来激活,这里之 ...
- 数据可视化之matplotlib模块
一.简介 Matplotlib是一个强大的Python绘图和数据可视化的工具包.数据可视化也是我们数据分析的最重要的工作之一,可以帮助我们完成很多操作,例如:找出异常值.必要的一些数据转换等.完成数据 ...
- vue+vant+js实现购物车原理小demo(中级版有选择)
增加只计算已选的的购物车商品功能.效果图: main.js: Vue.use(Stepper); Vue.use(Checkbox); Vue.use(CheckboxGroup); 上代码: < ...
- 网络拓扑—FTP服务搭建
目录 FTP服务搭建 网络拓扑 配置网络 FTP PC 安装FTP服务 配置FTP服务 FTP用户配置-1 PC机访问FTP站点 IE浏览器访问 终端访问 FTP用户配置-2 PC机访问ftp站点 I ...
- C语言:汉诺塔问题(Hanoi Tower)------递归算法
汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆 ...
- UnityShader数学基础篇
Mathf Mathf和Math 1.Math是C#中封装好的用于数学计算的工具类,位于System命名空间中. 2.Mathf是Unity中封装好的用于数学计算的工具结构体,位于UnityEngin ...