Skip to content
On this page

作用域

初始化全局对象(全局作用域)

全局作用域(global/window) 引擎会在执行代码之前,会在堆内存中创建一个全局对象:Global Object(GO)

  • 该对象 所有的作用域(scope)都可以访问;
  • 里面会包含 Date、Array、String、Number、setTimeout、setInterval 等等;
  • 其中还有一个 window 属性指向自己;

基本数据类型

  1. 先声明一个变量 a,没有赋值(默认值是 undefined)
  2. 在当前作用域中开辟一个位置存储 12 这个值
  3. 让变量 a 和 12 关联在一起(定义:赋值)
javascript
var a = 12;
var b = a;
// 把A存储的值放到一个新的位置上(直接操作值),让新位貿上的值和B保持关联,此时的B和A没有关系
b = 13;
console.log(a);
1
2
3
4
5

引用数据类型

javascript
var ary1 = [12, 23]; // 地址: AAAFFF111
//  引用数据类型 会将开辟出来的内存地址,指针指向地址
var ary2 = ary1; // 地址: AAAFFF111
ary2.push(100);
console.log(ary1);
1
2
3
4
5

私有作用域

把之前创建函数时函数的字符串代码执行

  • 私有作用域形成后,也不是立即代码执行,而是先进行变量提升(变量提升前,先形参赋值)
  • 在 ES3/ES5 语法规范中,只有全局作用域和函数执行的私有作用域(栈内存),其它大括号不会形成栈内存
javascript
function sum() { // 私有栈内存
    var total = null;
    for (var i = 0; i < arguments.length; i++) {
        var item = arguments[i];
        item = parseFloat(item);
        !isNaN(item) ? total += item : null;
    }
    return total;
}

console.log(sum); // 把整个函数的定义部分(函数本身在控制台输出)
console.log(sum(12, 23, '34', 'AA')); // 返回是函数执行后的结果
// 把当前函数执行的返回结果 (return 后面写的是啥,返回就是啥,如果没有 return, 默认返回 undefined)
1
2
3
4
5
6
7
8
9
10
11
12
13

栈内存 - 作用域

  1. 提供一个供 JS 代码自广而下执行的环境(代码都𣅽在𣏾中执行的
  2. 由于基本数据类型值比较简单,他们都是直接在栈内存中开辟个位置。把值直接存储讲夫的 => 当栈内仔被销毁,仔储的挑些基本值也都跟省销毁了

堆内存:引用值对两的空白

  1. 存储引用类型值的(对象函数:代码子符串) => 当前堆内存释放销毁,那么这个引用值彻底没了 => 堆内存的释放:当堆内存没有被任何的变量或者其它东西所占用,浏览器会在空闲的时候,自主的进行内存回收,把所有不被占用的堆内存销毁掉(谷歌浏览器)

销毁堆内存

xxx=null 通过空对象指斜可 计原始变量( 或者其它东西)谁都不指向,那么原有被占用的堆内存就没有被浏览器会销毁它

执行上下文栈(调用栈)

js 引擎内部有一个执行上下文栈(Execution Context Stack,简称 ECS),它是用于执行代码的调用栈。

全局的代码块

  • 全局的代码块为了执行会构建一个 Global Execution Context(GEC);
  • GEC 会 被放入到 ECS 中 执行

GEC 被放入到 ECS

  • 第一部分
    • 在代码执行前,在 parser 转成 AST 的过程中,会将全局定义的变量、函数等加入到 GlobalObject 中, 但是并不会赋值
    • 这个过程也称之为变量的作用域提升(hoisting)
  • 在代码执行中,对变量赋值,或者执行其他的函数
沪ICP备20006251号-1