变量、作用域与内存


1 .原始值与引用值

Undefined、Null、Boolean、Number、 String和Symbol。保存原始值的变量是按值(by value)访问的

引用值是保存在内存中的对象。

1.1动态属性

引用值可以随时添加、修改和删除其属性和方法

原始值不能有属性,但给原始值添加属性不会报错

1.2传递参数

ECMAScript的所有参数都是传递值的(包括原始值和引用值)

1.3判断类型

typeof 对 对象类型的支持不好 提供了 instanceof 操作符

console.log(person instanceof Object);  // 变量person是Object吗?

2.执行上外文与作用域

  • 上下文

    分为全局上下文和函数上下文。每个上下文都有一个变量对象(可以认为上下文就是这个对象),上下文中定义的所有

    变量和函数都在这个对象上。例如:在浏览器环境 全局上下文就是window。

  • 作用域链

    代码执行时会创建穿起变量对象的一个作用域链,作用域链决定了代码访问变量和函数的顺序。当前上下文变量对象始终位于

    作用域链最前端。例如:上下文为函数,则其活动对象最初只有arguments。

    作用域链下一个变量对象来自包含上下文,再下一个对象来自再下一个包含上下 文。以此类推直至全局上下文;

代码执行时的标识符解析是通过沿作用域链逐级搜索 标识符名称完成的。搜索过程始终从作用域链的最前端开始,然后逐级往后,直到找到标识符。(如果没有找到标识符,那么通常会报错。)

2.1作用域链增强

某些语句会导致在作用域链前端临时添加一个上下文,这个上下文在代码执行后会被删除。通常在两种情况下会出现这个现象,即代码 执行到下面任意一种情况时:

  • try/catch语句的catch块
  • with语句
function buildUrl() {
let qs = "?debug=true";
with(location){
var url = href + qs;
}
return url;
}

在搜索href标识符时会先在location对象中搜索

2.2变量声明

  • var声明变量

    使用var声明变量时,变量会被自动添加到最接近的上下文。在函数中,最接近的上下文就是函数的局部上下文。

    如果变量未经声明就被初始化了,那 么它就会自动被添加到全局上下文(只能赋值不能访问,相当于找到最后到了全局上下文没找到也没关系 增加一个属性(在window上)就好)严格模式下报错

  • let声明变量

    块作用域(局部作用域),全局声明不会成为全局对象上的属性,其他和var大体相同。

  • const声明变量

    使用const声明的变量必须同时初始化,否则报错。

3.垃圾回收

JavaScript是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内存。

3.1标记清理

JavaScript最常用的垃圾回收策略是标记清理 (mark-and-sweep)。下面简述大概步骤:

① 先对内存(堆)中的对象进行扫描,在当前上下文中能访问到的对象上做标记

② 对刚才做了标记的对象中进行扫描,对扫描到的对象做标记

③ 重复②的步骤,直到没有对象需要扫描

④ 执行垃圾清理,回收没有被标记的对象的内存

3.2引用计数

其思路是对每个值都记录它被引用的次数。由于存在像循环引用这样的问题不常用。

3.3关于性能

关于性能具体参考另一篇文章。

Js的变量、作用域与内存的更多相关文章

  1. 第一百零六节,JavaScript变量作用域及内存

    JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...

  2. js 变量 作用域及内存

    由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...

  3. js的变量作用域

    js不支持块级变量作用域,而是包含它们的函数的作用域, 例如: function query() { ; ; i < ; i++) { var b = i; } return b + a; } ...

  4. js学习--变量作用域和作用域链

    作为一名菜鸟的我,每天学点的感觉还是不错的.今天学习闭包的过程中看到作用域与作用域链这两个概念,我觉得作为一名有追求的小白,有必要详细了解下. 变量的作用域 就js变量而言,有全局变量和局部变量.这里 ...

  5. js基础之--变量 作用域和内存问题

    基本类型:Undefind Null Boolean Number String 引用类型: 对象 在操作对象时,实际上实在操作对象的引用而不是实际的对象.为此,引用类型的值是按引用访问的. 从一个变 ...

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

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

  7. JavaScript变量作用域和内存问题(二)

    执行环境是js中特别重要的概念,是指变量或者函数可以访问其他数据,定义自己的行为.每个执行环境都有一个与之相对应的变量对象,执行环境中定义的所有变量和函数都保存在这个变量中,我们看不到这个变量,但是后 ...

  8. 浅谈javascript中变量作用域和内存(1)

    先理解两个概念:基本类型和引用类型的值 1.基本类型和引用类型的值 (1)定义: 基本类型:指简单的数据段,比如按值访问的js五种基本数据类型undefined.null.boolean.number ...

  9. 浅谈javascript中变量作用域和内存(2)

    1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...

  10. js的变量作用域 ,变量提升

    (function(){ a = 5; alert(window.a); var a = 10; alert(a); })(); 结果: undefined 10 代码等同于下面 var a = un ...

随机推荐

  1. Linux Python2 升级到 Python3

    国内企业服务器用 CentOS 系统的比较多,CentOS8 系统已经将系统默认 Python 版本调整为了 Python3,但是 CentOS7 的存量还是很大,毕竟对企业生产服务来说稳定大于一切, ...

  2. P1223_排队接水(JAVA语言)

    思路 根据短作业优先平均等待时间最短的常识(默默感叹一句操作系统没白学),将Ti从小到大排序后,计算平均等待时间输出 //水题 题目描述 有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请 ...

  3. 攻防世界 resver catch-me

    catch-me asis-ctf-quals-2016 附件给了个压缩包文件,重命名,解压,获取到elf文件 程序有两处关键比较 第一处: 这里进行动态调试,得到v3=0xB11924E1, byt ...

  4. 攻防世界 maze NJUPT CTF 2017

    迷宫题 1 __int64 __fastcall main(__int64 a1, char **a2, char **a3) 2 { 3 signed __int64 mid_i; // rbx 4 ...

  5. effective解读-第八条 避免使用finalizer和Cleaner

    java9之前finalizer,java9使用cleaner代替了finalizer.相比finalizer,cleaner(它存在于一个独立类Cleaner中,需要时候注入到对应类中即可)不会污染 ...

  6. 软工案例分析作业-CSDN

    项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 案例分析作业要求 我在这个课程的目标是 提升软件开发能力与团队意识 这个作业在哪个具体方面帮助我实 ...

  7. Java(65-80)【方法、数组】

    1.方法的三种调用:单独调用.打印调用.赋值调用 单独调用就是调用方法并不进行输出: 打印调用就是对方法进行输出 赋值调用就是将结果赋值给一个变量再进行输出 void是没有返回值的,因此只能进行赋值单 ...

  8. Seata搭建与分布式事务入门

    在单体架构下,我们大多使用的是单体数据库,通过数据库的ACID特性支持,实现了本地事务.但是在微服务架构下复杂的业务关系中,分布式事务是不可避免的问题之一.Seata是Spring Cloud Ali ...

  9. JAP 1.0.1 以及 《JAP产品技术白皮书》正式发布

    快讯 JAP 1.0.1 正式发布 <JAP产品技术白皮书>正式发布.立即获取:白皮书 JAP 1.0.1 版本内容 新增功能/支持 添加 com.fujieid.jap.core.uti ...

  10. Django中 render() 函数的使用方法

    render() 函数 在讲 render() 函数之前,我们在 Django 项目 index 文件夹的 urls.py 和 views.py 中编写如下功能代码:(不难,望读者细心阅之) # in ...