1、(undefined, number, string, boolean)属于简单的值类型,不是对象。函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型。判断一个变量是不是对象非常简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。
2、一切(引用类型)都是对象,对象是属性的集合。对象都是通过函数创建的。
3、每个函数function都有一个prototype,即原型。这里再加一句话——每个对象都有一个__proto__,可成为隐式原型。每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。Object.prototype确实一个特例——它的__proto__指向的是null,切记切记!
4、访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。
5、变量、函数表达式——变量声明,默认赋值为undefined;this——赋值;函数声明——赋值;这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。函数每被调用一次,都会产生一个新的执行上下文环境。函数在定义的时候(不是调用的时候),就已经确定了函数体内部自由变量的作用域。
5、在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了。如果函数作为对象的一个属性时,并且作为对象的一个属性被调用时,函数中的this指向该对象。注意,如果fn函数不作为obj的一个属性被调用,如果fn函数被赋值到了另一个变量中,并没有作为obj的一个属性被调用,那么this的值就是window,this.x为undefined。其实,不仅仅是构造函数的prototype,即便是在整个原型链中,this代表的也都是当前对象的值。
6、执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境。当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境。处于活动状态的执行上下文环境只有一个。其实这是一个压栈出栈的过程——执行上下文栈。
7、要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用”,切记切记——其实这就是所谓的“静态作用域”。这个一步一步“跨”的路线,我们称之为——作用域链。
8、但是你只需要知道应用的两种情况即可——函数作为返回值,函数作为参数传递。有些情况下,函数调用完成之后,其执行上下文环境不会接着被销毁。这就是需要理解闭包的核心内容。