AI智能
改变未来

Js的变量、作用域与内存


变量、作用域与内存

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关于性能

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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Js的变量、作用域与内存