作用域链
- 让人迷惑的例子
function foo() {console.log(v)} function foo1() { var v = "v1" foo() console.log(v) } var v = "v"; foo1();
- 外部引用: 每个执行上下文的变量环境中,都包含了一个外部引用,用来指向外部的执行上下文。
- 词法作用域: 词法作用域是指函数声明的位置来决定的,是静态的作用域,通过它就能够预测代码在执行过程中如何查看标识符。
- 词法作用域在代码阶段就决定好了,和函数怎么调用没有关系
闭包
- 在js中,根据词法作用域的规则,内部函数总是可以访问外部函数声明的变量,当通过一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了,内部函数引用外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包。
- 1 预扫描内部函数
- 2 把内部函数引用的外部变量保存到堆中
内存空间
- 栈空间:原始类型的数据值都是直接保存在”栈“中的
- 通常情况下,栈空间都不会设置太大,主要要来存放一些原始类型的小数据
- 堆空间:引用类型的值是存放在”堆“中的
- 堆空间很大,能存放很多的数据
- 原始类型的赋值会完整复制变量值,而引用类型的赋值是复制引用类型