4.1 基本类型和引用类型的值

  • 基本类型: 简单的数据段
  • 引用类型: 指那些可能有多个值构成的对象, 指保存在内存中的对象

4.1.2 复制变量值

  • 除了保存的方式不同之外,在从一个变量向另一个变量复制基本类型值和引用类型值时,也存在不同
  1. 基本类型: 如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上

  2. 引用类型: 当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一 个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另 一个变量

4.1.3 传递参数

  • 传递基本类型
    function addTen(num) {num += 10return num;}var count = 20var result = addTen(count)console.log(count) // 20, 没有变化console.log(result) // 30
复制代码
  • 传递引用类型
    function setName(obj) {obj.name = "Nicholas"}var person = new Object()setName(person);console.log(person.name) // "Nicholas"
复制代码
    // 为了证明对象是按值传递的function setName(obj) {obj.name = "Nicholas"obj = new Object()obj.name = "Greg"}var person = new Object()setName(person);console.log(person.name) // "Nicholas"
复制代码

4.1.4 检测类型

  • typeof: 检测基本数据类型, string, number, boolean, undefined,object(对象, null)
  • instanceof: 检测引用类型, 什么类型的对象, 所有引用类型的值都是 Object 的实例

4.2 执行环境及作用域

  • 执行环境定义了**函数和变量有权访问的其他数据, 每个执行环境都有与之对应的变量对象**, 环境中定义的变量和函数都定义在这个对象中
  • 全局环境是最外层的执行环境, 在web浏览器中被认为是**windows**对象,因为所有的全局变量和函数都作为window 对象的属性和方法,执行环境中的代码执行完毕后,该环境被销毁,其中的所有变量和函数定义也随之销毁
  • 每个函数都有自己的执行环境, 当执行流进入某个函数时, 函数的执行环境就会就会进入环境栈, 函数执行完毕后,环境出栈, 把控制权交给之前的执行环境
  • 当代码在某个环境中执行, 会创建变量对象的**作用域链, 作用域链保证对执行环境有权访问的所有变量和函数的有序访问, 作用域链的前端始终是当前执行环境的变量对象,最后一个对象是全局环境中的变量对象**, 如果这个环境是函数,则将其活动对象作为变量对象. 活动对象最开始只包含arguments对象(全局环境不存在)
    var color = 'blue'function changeColor() {if (color === 'blue') {color = 'red'} else {color = 'blue'}}changeColor()console.log(color)// changeColor() 函数中包含自己的变量对象和全局环境的变量对象
复制代码
        var color = "blue";function changeColor(){var anotherColor = "red";function swapColors(){var tempColor = anotherColor;anotherColor = color;color = tempColor;// 这里可以访问color、anotherColor和tempColor }// 这里可以访问color和anotherColor,但不能访问tempColorswapColors();}// 这里只能访问color changeColor();
复制代码

函数的作用域链图

4.2.1 延长作用域链

当执行流进入下列任何一个语句时,作用域链就会得到加长:

  • try-catch语句的catch块
  • with语句

这两个语句都会在作用域链的前端添加一个变量对象,对with语句来说,会将指定的对象添加到作用域链中.对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明

4.2.2 没有块级作用域

javascript没有块级作用域

    if (true) {var color = "blue"}console.log(color) // blue// javascript中, if 语句中的变量声明会将变量添加到当前的执行环境中
复制代码
    function func() {if (true) {var color = "blue"}console.log(color) }func() // blueconsole.log(color) // error// color 添加到了func执行环境中,并没有添加到window执行环境中
复制代码
    for (var i = 0; i < 10; i++) {......}console.log(i) // 10
复制代码
  • 声明变量 var 声明的变量会被添加到最近的环境中,在**函数内部就是最近的环境就是局部环境; 在with语句中就是函数环境, 如果初始化变量没有使用var则被添加到全局环境**中
    function add(num1, num2) {var sum = num1 + num2return sum}var result = add(10, 20) // 30console.log(sum) // error
复制代码
    function add(num1, num2) {sum = num1 + num2return sum}var result = add(10, 20) // 30console.log(sum) // 30
复制代码
  • 标识符查询 在某个环境中为了读取或者写入而引入一个标识符,必须通过搜索来确定该标识符的意思, 搜索过程从当前作用域前端开始逐步向上查找直至全局作用域为止
    var color = 'blue'function getColor() {return color}console.log(getColor()) // 'blue'
复制代码

搜索过程如下

转载于:https://juejin.im/post/5c3561f2f265da611a480b3c

JavaScript高级程序设计笔记 - 第四章 变量 作用域 内存问题相关推荐

  1. JavaScript高级程序设计 第四章---变量 作用域 内存

    第四章-变量 作用域 内存 关键字:变量 作用域 内存 本章内容 通过变量使用原始值与引用值 理解执行上下文 理解垃圾回收 4.1 原始值与引用值 ECMAScript 变量可以包含两种不同类型的数据 ...

  2. JavaScript高级程序设计笔记01 | 第一章到第四章 | 关键字与保留字 | 数据类型 | 操作符 | 作用域

    观前提示:大部分都是书上的内容,个人理解的部分的较少,看我的笔记还不如去看书 第二章 async:可选.表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本.只对外部 ...

  3. 2020.11.4 《JavaScript高级教程》 第四章 变量、作用域和内存问题 第五章 引用类型(对象 数组 date function)

    第四章 变量,作用域和内存问题 基本类型和引用类型的区别 1.基本类型不能直接添加属性 引用类型可以直接添加属性: var person = new object();person.name = &q ...

  4. JavaScript高级程序设计(第四章)

    4.变量.作用域和内存问题 4.1 基本类型和引用类型的值 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是 简单的数据段,引用类型值指那些可能由多个值 ...

  5. 《JavaScript高级程序设计(第四版)》红宝书学习笔记(2)(第四章:变量、作用域与内存)

    个人对第四版红宝书的学习笔记.不适合小白阅读.这是part2.持续更新,其他章节笔记看我主页. (记 * 的表示是ES6新增的知识点,记 ` 表示包含新知识点) 第四章:变量.作用域与内存 4.1 原 ...

  6. 《JavaScript高级程序设计(第四版)》红宝书学习笔记(第五章:基本引用类型,原始值包装类型,单例内置对象)

    第五章:基本引用类型 引用值(或者对象)是某个特定引用类型的实例.新对象通过使用new操作符后跟一个构造函数(constructor)来创建. 5.1 Date 这里不对Date进行详细深入,仅基于书 ...

  7. 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

    5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对 ...

  8. 《JavaScript高级程序设计(第四版)》红宝书学习笔记(1)

    个人对第四版红宝书的学习笔记.不适合小白阅读.这是part1,包含原书第二章(HTML中的Javascript)和第三章(语言基础).持续更新,其他章节笔记看我主页. (记 * 的表示是ES6新增的知 ...

  9. 《javascript高级程序设计》第六章 读书笔记 之 javascript对象的几种创建方式

    本文首发于https://segmentfault.com/a/1190000017776314 一.工厂模式 工厂模式:使用字面量和object构造函数会有很多重复代码,在此基础上改进 解决了多个相 ...

最新文章

  1. cpu密集型 计算密集型 io密集型 简介
  2. UA MATH567 高维统计 专题0 为什么需要高维统计理论?——以线性判别分析为例
  3. 信用评分如何应用在风控策略中(二)
  4. boost::stl_interfaces模块实现节点迭代器的测试程序
  5. 东南亚版“QQ 音乐”:JOOX 的音乐推荐重构之路
  6. kafka消费者接收分区测试
  7. 外设驱动库开发笔记19:BMP280压力温度传感器驱动
  8. python 列表索引位置,python – 在列表中查找值的第一个位置
  9. python文本文档_Python3 File
  10. 2021时间序列-对比学习必读的四篇论文
  11. C语言从入门到精通保姆级教程(2021版上)
  12. Arch Linux下 让MPlayer用上CoreAVC1.7.0.0解码器
  13. 非学习的点云配准方法汇总
  14. Excel比较两列的值
  15. 迪普科技负载均衡助力金关工程(二期)核心业务交付
  16. matlab函数grid,Matlab基本函数-grid、box函数
  17. dtu MySQL_DTU-DATACENTER
  18. 全国25省市“智慧路灯”项目大汇总!
  19. 分治算法之循环赛程日志表
  20. 运用计算机巧记英语词汇,词根词缀法巧记考研英语词汇:词根graph-(写)

热门文章

  1. python对文件的处理_python文件处理fileinput使用方法详解
  2. ajax js java省市三级联动菜单,AJAX省市区三级联动下拉菜单(java版)
  3. python实现两个接口的依赖关系
  4. c++interesting转换为uint_拆一款C转HDMI转换器,没想到一个简单的产品里面这么多芯片...
  5. java 缓存行填充_缓存伪共享问题以及解决方案缓存行填充
  6. 计算机辅助普通话测试试题及答案,普通话测试试题及答案
  7. Linux保护文件实现,Linux完整性保护机制模块实现分析(1)
  8. Eclipse 常用快捷键及使用技巧!
  9. IDEA本地运行Spark项目[演示自定义分区器]并查看HDFS结果文件
  10. Spring Boot学习笔记:Spring Boot的Web功能