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访问浏 ...
随机推荐
- 技术干货 | mPaaS 小程序高玩带你起飞:客户端预置小程序无视网络质量
简介: 弱网拉包无障碍,深度提升用户体验 传统的小程序技术容易受到网络环境影响,当网络质量不佳时可能导致拉取不到小程序包的情况.通过预置小程序,即可规避该问题.本文介绍了预置小程序的原理和预置小程序的 ...
- SQL server 批量删除表
select 'drop table '+name+';' from sys.tables declare c cursor forselect NAME from sysobjects where ...
- Ingress-Controller高可用方案及多租户场景(21)
一.Ingress-controller高可用 Ingress Controller 是集群流量的接入层,对它做高可用非常重要,可以基于 keepalive 实现 nginx-ingress-cont ...
- gorm 动态拼接查询条件
结构体 type Mould struct { MouldId string `grom:"column:mouldID"` MouldInteriorID string `gro ...
- DNS(6) -- DNS子域实现
目录 1. DNS子域 1.1 子域授权环境说明 1.2 子域授权实现 1.2.1 主域DNS服务器配置 1.2.2 子域DNS服务器配置 1.3 DNS转发域 1.3.1 DNS转发域概述 1.3. ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-45-鼠标操作-下篇
1.简介 鼠标为我们使用电脑提供了很多方便,我们看到的东西就可以将鼠标移动过去进行点击就可以打开或者访问内容,当页面内容过长时,我们也可以使用鼠标滚轮来实现对整个页面内容的查看,其实playwrigh ...
- Selenium4自动化测试3--元素定位By.NAME,By.LINK_TEXT 和通过链接部分文本定位,By.PARTIAL_LINK_TEXT,css_selector定位,By.CSS_SELECTOR
4-通过名称定位,By.NAME name属性为表单中客户端提交数据的标识,一个网页中name值可能不是唯一的.所以要根据实际情况进行判断 import time from selenium impo ...
- 4G EPS 中的随机接入
目录 文章目录 目录 前文列表 UE 的随机接入 基于竞争的随机接入流程 基于非竞争的随机接入流程 PRACH(物理随机接入信道) 上行 TA(时间提前量) 前文列表 <4G EPS 中的小区搜 ...
- k8s快捷命令
查看node使用率: for i in `kubectl get nodes|awk '{print $1}'|sed '1d'`;do echo "=========>" ...
- kubernetes运行应用Controller3之Job、CronJob详解
成功启动一个Job 1.Job.spec.template.metadata,没有空格符的错误 [machangwei@mcwk8s-master ~]$ cat mcwJob1.yml apiVer ...