Appearance
作用域
初始化全局对象(全局作用域)
全局作用域(global/window)
引擎会在执行代码之前,会在堆内存中创建一个全局对象:Global Object(GO)
- 该对象 所有的作用域(scope)都可以访问;
- 里面会包含 Date、Array、String、Number、setTimeout、setInterval 等等;
- 其中还有一个 window 属性指向自己;
基本数据类型
- 先声明一个变量 a,没有赋值(默认值是 undefined)
- 在当前作用域中开辟一个位置存储 12 这个值
- 让变量 a 和 12 关联在一起(定义:赋值)
javascript
var a = 12;
var b = a;
// 把A存储的值放到一个新的位置上(直接操作值),让新位貿上的值和B保持关联,此时的B和A没有关系
b = 13;
console.log(a);
1
2
3
4
5
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
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
2
3
4
5
6
7
8
9
10
11
12
13
栈内存 - 作用域
- 提供一个供 JS 代码自广而下执行的环境(代码都𣅽在𣏾中执行的
- 由于基本数据类型值比较简单,他们都是直接在栈内存中开辟个位置。把值直接存储讲夫的 => 当栈内仔被销毁,仔储的挑些基本值也都跟省销毁了
堆内存:引用值对两的空白
- 存储引用类型值的(对象函数:代码子符串) => 当前堆内存释放销毁,那么这个引用值彻底没了 => 堆内存的释放:当堆内存没有被任何的变量或者其它东西所占用,浏览器会在空闲的时候,自主的进行内存回收,把所有不被占用的堆内存销毁掉(谷歌浏览器)
销毁堆内存
xxx=null 通过空对象指斜可 计原始变量( 或者其它东西)谁都不指向,那么原有被占用的堆内存就没有被浏览器会销毁它
执行上下文栈(调用栈)
js 引擎内部有一个执行上下文栈(Execution Context Stack,简称 ECS),它是用于执行代码的调用栈。
全局的代码块
- 全局的代码块为了执行会构建一个 Global Execution Context(GEC);
- GEC 会 被放入到 ECS 中 执行
GEC 被放入到 ECS
- 第一部分
- 在代码执行前,在 parser 转成 AST 的过程中,会将全局定义的变量、函数等加入到 GlobalObject 中, 但是并不会赋值
- 这个过程也称之为变量的作用域提升(hoisting)
- 在代码执行中,对变量赋值,或者执行其他的函数
