6.1 作用域与作用域链
6.1.1 函数也是一种对象的类型,也是引用类型,引用值
var obj = {
name:'实例',
address:'地址',
teach:function(){}
}
function fn(a, b) {}
console.log(fn.name);
console.log(fn.length);
console.log(fn.prototype);
6.1.2 函数的隐式属性(无法访问,JS引擎内部固有的隐式属性)
1. [[scope]](作用域)属性和[scope Chain](作用域链)属性
- 每一个函数声明在定义的时候,系统自动生成
[[scope]]属性,作用域链[scope Chain] 中就已经保存了全局的执行期上下文GO;
[[scope]](作用域)属性是存放[scope Chain](作用域链)的容器;
[scope Chain](作用域链)是存放函数AO / GO的容器;
- AO: 函数的执行期上下文 GO: 全局的执行期上下文;
2. 实例操作演示作用域和作用域链的产生与销毁
function a() {
function b() {
var b = 2;
}
var a = 1;
b();
}
var c = 3;
a();
GO = {
c:undefined,
-->3,
a:function a(){};
}
AO = {
a:undefined,
--> 1
b:function b() {}
}
AO = {
b:undefined;
--> 2
}





3. 函数执行完成后,销毁AO函数的执行期上下文;再次调用函数,生成新的AO函数执行期上下文
4. 函数不调用就不会执行,如果不执行,那么内部的其他函数声明也不会被定义
5. 函数声明和函数的表达式产生作用域和作用域链的时间
[[scope]] --> Scope Chain ---> GO
AO
var fn1 = function() {};
function fn2() {};
Go = {
fn1: undefined;
--> function() {};
fn2: function fn2() {};
}
6.1.3 闭包的初始
1. 闭包定义
- 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。
- 闭包也是一种现象,当内部的函数被返回到外部并保存时,一定会产生闭包,闭包会产生原来的而作用域链不释放,过度的闭包可能导致内存泄漏,或加载过慢。
2. 闭包的作用域与作用域链的产生与销毁
function fn1() {
function fn2() {
var b = 2;
a = 2;
console.log(a);
}
var a = 1;
return fn2;
}
var fun = fn1();
fun();
