变量、作用域与内存

原始值与引用值

什么是字面量形式?

let obj = {
key1: val1,
key2: val2,
foo () {
}
}

这就是字面量形式,手动声明一个对象的属性和方法,而不是通过构造函数。这样声明简单,但不能复用。 引用

-> 原始类型初始化只能使用字面量形式

复制值

原始值和引用值在变量复制时也有差别

1. 原始值的复制是拷贝

2. 引用值的复制实际上是指针的拷贝

传递参数

ECMAScript中参数传递只有按值传递,它的参数就是局部变量

  1. 如果是原始值则拷贝
  2. 如果是引用值则拷贝指针

    -> 这就导致在局部作用域中修改obj的属性值,也会影响到外部。因为拷贝的引用是指向堆内存的

确定类型

  1. typeof:适用于判断变量是否为原始类型。特别是变量是否为字符串、数值、布尔值或undefined。如果是null,那么typeof就会返回object。typeof对于所有对象都返回object
  2. 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的定义放到外面就会报错

函数参数被认为是当前上下文中的变量,因此也跟上下文中的其他变量遵循相同的访问规则

作用域链增强

  1. try/catch语句的catch块
  2. with语句

变量声明

  1. 使用var声明的变量会被自动添加到最接近的上下文,如果未经定义就被初始化了会被添加到全局上下文。
  2. var声明会被拿到函数或者作用域的顶端,在作用域所有代码之前。这个现象叫做:“提升”。提升让同一作用域中的代码不必考虑变量是否已经声明就可以使用。
console.log(age); // undifined

var age = 1;
  1. 使用let块级作用域声明。块级作用域由最近的一对包含花括号* { } * 界定。
  2. let与var的不同之处:
    1. 重复的var声明会被忽略,不会报错
    2. 重复的let声明会报错
    3. 使用var声明的循环迭代变量会泄露到循环外部
    4. let声明的变量会有暂时性死区,即在声明前调用会报错
  3. 使用const声明的变量必须同时赋值,且在其生命周期中不能再重新赋值。其余与let变量相同。
    1. const保存的对象虽然引用不能改变,但是属性不受限制。
    2. 如果希望整个对象都不能修改,可以使用Object.freeze()
  4. 使用标识符查找

垃圾回收

垃圾回收的基本思路:确定哪个变量不再使用之后,释放它占用的内存。这个过程是周期性的,垃圾回收程序每隔一定时间就会自动运行。

标记未使用的变量:

  1. 标记清理
  2. 引用计数

标记清理

引用计数

性能

内存管理

使用let和const会提高垃圾回收的性能

Javascript高级程序设计第四章 | ch4 | 阅读笔记的更多相关文章

  1. javascript高级程序设计第四章 变量、作用域和内存问题

    变量包含两种,,基本类型和引用类型 基本类型是指一些简单的字段: 引用类型是☞由多个值构成的对象  引用类型的值是保存在内存中的对象,在javascript中是不允许直接访问内存中的位置; 函数的参数 ...

  2. javascript高级程序设计第三章的一些笔记

    [TOC] 1. 语法 1.1 区分大小写 变量.函数名和操作费都区分大小写. 1.2 标识符 标识符指变量.函数.属性的名字,或者函数的参数.标识符按以下规则组合: 第一个字符必须是一个字母,下划线 ...

  3. 《JavaScript高级程序设计》——第二章在HTML使用JavaScript

    这章讲的是JavaScript在HTML中的使用,也就是<script>元素的属性.书中详细讲了async.defer.src和type四个<script>的属性. 下面是对第 ...

  4. JavaScript高级程序设计学习(四)之引用类型

    在javascript中也是有引用类型的,java同样如此. javascript常见也比较常用的引用类型就熟Object和Array. 一个对象和一个数组,这个在前后端分离开发中也用的最多.比如aj ...

  5. JavaScript高级程序设计第14章表单脚本 (学习笔记)

    第十四章 表单脚本 1.阻止默认表单提交 1.提交表单数据 1.使用type=submit提交按钮 2.使用submit():方法 注意:当用户点击提交按钮时,会触发submit事件,从而在这里我们有 ...

  6. JavaScript高级程序设计学习(四)之引用类型(续)

    一.Date类型 其实引用类型和相关的操作方法,远远不止昨天的所说的那些,还有一部分今天继续补充. 在java中日期Date,它所属的包有sql包,也有util包.我个人比较喜欢用util包的.理由, ...

  7. JavaScript 高级程序设计 第5章引用类型 笔记

    第五章 引用类型 一.object类型 1.创建方法: 1.使用new 操作符创建 var person=new object() Person.name=”Nicholasa” Porson.age ...

  8. 《JavaScript 高级程序设计》第一章:简介

    JavaScript 历史 JavaScript的诞生的主要是当时的 netspace 公司谋求为自己的浏览器 Navigator 添加一种脚本语言,以便在本地客户端进行一些行为操作,而这一功能的需求 ...

  9. JavaScript高级程序设计第20章JSON 笔记 (学习笔记)

    第二十章 JSON 1.Json 可以表示三种类型的值: 1.简单值: 表示数值:5  表示字符串:“hello wrold”注表示字符串时必须使用双引号 2.对象: {“name”:“mi”,”ag ...

  10. 读书时间《JavaScript高级程序设计》四:BOM,客户端检测

    隔了一段时间,现在开始看第8章. 第8章:BOM BOM提供了很多对象,用于访问浏览器的功能.BOM的核心对象是window,它表示浏览器的一个实例. window对象是通过javascript访问浏 ...

随机推荐

  1. 阿里云发布第四代神龙架构,提供业界首个大规模弹性RDMA加速能力

    ​简介:10月20日,2021年杭州云栖大会上,阿里云发布第四代神龙架构,升级至全新的eRMDA网络架构,是业界首个大规模弹性RDMA加速能力. 10月20日,2021年杭州云栖大会上,阿里云发布第四 ...

  2. Apsara Stack 技术百科 | 浅谈阿里云混合云新一代运维平台演进与实践

    ​简介:随着企业业务规模扩大和复杂化及云计算.大数据等技术的不断发展,大量传统企业希望用上云来加速其数字化转型,以获得虚拟化.软件化.服务化.平台化的红利.在这个过程中,因为软件资产规模持续增大而导致 ...

  3. 阿里云数据库开源重磅发布:PolarDB HTAP的功能特性和关键技术

    简介:在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家严华带来了主题为<PolarDB HTAP详解>的精彩演讲.在PolarDB存储计算分 ...

  4. 探秘RocketMQ源码——Series1:Producer视角看事务消息

    简介: 探秘RocketMQ源码--Series1:Producer视角看事务消息 1. 前言 Apache RocketMQ作为广为人知的开源消息中间件,诞生于阿里巴巴,于2016年捐赠给了Apac ...

  5. 国产 Web 组态软件 TopStack V5.0 发布

    简介 TopStack 是一款轻量型 Web 组态软件,提供设备数据采集.定时任务.控制策略.联动控制.设备告警.设备维护管理.设备绩效管理.能源管理.组态开发.报表开发等核心功能.支持移动端访问,支 ...

  6. Linux下ffmpeg库的编译链接

    /usr/bin/ld: /usr/local/ffmpeg/lib/libavformat.a(aviobuf.o): in function `ff_crc04C11DB7_update':/ho ...

  7. 【GUI软件】小红书详情数据批量采集,含笔记内容、转评赞藏等,支持多笔记同时采集!

    目录 一.背景介绍 1.1 爬取目标 1.2 演示视频 1.3 软件说明 二.代码讲解 2.1 爬虫采集模块 2.2 软件界面模块 2.3 日志模块 三.获取源码及软件 一.背景介绍 1.1 爬取目标 ...

  8. 【股票爬虫教程】我用100行Python代码,爬了雪球网5000只股票,还发现一个网站bug!

    目录 一.爬取目标 二.分析网页 三.爬虫代码 四.同步视频 五.get完整源码 一.爬取目标 您好,我是@马哥python说,今天继续分享爬虫案例. 爬取网站:雪球网的沪深股市行情数据 具体菜单:雪 ...

  9. ruby操作excel

    操作xlsx axlsx插件 操作xls spreadsheet插件

  10. 使用SQL Server语句统计某年龄段人数占总人数的比例(多层查询语句嵌套-比例分析)

    需求:需统计出某个集合内,某个段所占的比例,涉及SELECT查询语句的嵌套,如有疑问可留言. 如下: --按性别进行年度挂号年龄段分析--男SELECT 年龄段,SUM(人数) 数量,cast(cas ...