变量、作用域与内存

原始值与引用值

什么是字面量形式?

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. 云效故障定位研究论文被ICSE 2021 SEIP track收录

    近期,由阿里云云效团队联合复旦大学CodeWisdom研究团队.阿里技术风险部安全生产团队,合作完成的论文<MicroHECL: High-Efficient Root Cause Locali ...

  2. 来电科技:基于 Flink + Hologres 的实时数仓演进之路

    简介: 本文将会讲述共享充电宝开创企业来电科技如何基于 Flink + Hologres 构建统一数据服务加速的实时数仓 作者:陈健新,来电科技数据仓库开发工程师,目前专注于负责来电科技大数据平台离线 ...

  3. [FE] jsoneditor 在 vue-router 和 vue-ssr 渲染下出现两个实例的问题

    由于 vue-router 页面是无刷新的,如果存在两次渲染,会出现如下情形. 简单粗暴的解决办法是通过判断容器中是否已经有了子节点. 此时再从其他 router link 返回就不会重复渲染了. M ...

  4. [FE] uni-app 动态改变 navigationBarTitleText 导航标题

    改导航文字: uni.setNavigationBarTitle({ title: 'xx' }); 改 tabBar 文字: uni.setTabBarItem({ index: 0, text: ...

  5. WPF 基于 .NET 5 框架和 .NET 6 的 SDK 进行完全单文件发布

    本文来告诉大家如何基于 .NET 5 框架和 .NET 6 SDK 进行完全单文件发布,这是对 WPF 应用程序进行独立发布,生成的是完全单文件的方法 在之前的版本,尽管也是基于 .NET 5 框架的 ...

  6. vue通过input选取图片,jq的ajax向服务器上传img

    <template>   <div class="">     <!-- 选择后预览 -->     <img v-if="im ...

  7. js实现一个拖拽效果(本例vue中),边界限定,获取鼠标坐标,div坐标

    有事没事搞个图: demo: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  8. 如何在M1 MACBOOK上准备好ORB-SLAM2的环境

    1. 环境 M1 Macbook Air Parallels Desktop 17 关于虚拟机,在之前尝试了UTM,但是性能欠佳,卡顿情况比较多,而且未能解决联网问题,最终只能含泪放弃 Paralle ...

  9. 01 Xpath简明教程(十分钟入门)

    目录 Xpath简明教程(十分钟入门) Xpath表达式 Xpath节点 节点关系 Xpath基本语法 1) 基本语法使用 2) xpath通配符 3) 多路径匹配 Xpath内建函数 Xpath简明 ...

  10. redis-desktop-manager-0.8.0.3844

    redis-desktop-manager-0.8.0.3844 下载地址: https://www.aliyundrive.com/s/Y2fobkVjAdF 链接:https://pan.baid ...