function Object的创建过程
解析器在遇到function declaration或者function expression的时候,会创建一个function Object。步骤大致如下:
- 解析形参和函数体
- 创建一个native ECMAScript Object:F
- 设置F的[[Class]]、[[Prototype]]、[[Call]]、[[Construct]]、[[Scope]]、length属性
- 创建一个new Object():O
- 设置O的constructor属性为F
- 设置F的prototype属性为O
在这个创建过程里,要说明的几点是:
- 步骤3中F的[[Prototype]]被设置为Function.prototype
- 用户自定义的function,都会同时具有[[Call]]和[[Construct]]这两个internal属性
- 解析器会自动给每一个function Object初始化一个prototype成员。而F.prototype.constructor == F,所以,当我们没有重新定义这个F的prototype成员的时候,F的实例的constructor成员是靠谱的。因为(new F).constructor其实方位的是F.prototype.constructor,而解析器默认初始化给你的 F.prototype.constructor就是F。
- 关于[[scope]]和作用域链的问题,下文分解
还要提的一点是,function declaration和function expression是不一样的
function declaration:
function fn () {}
function expression:
var a = function () {}; function () {};
------------------- 切割线 ----------------------