1.一切都是对象----一切(引用类型)都是对象,对象是属性的集合
(undefined, number, string, boolean)属于简单的值类型,不是对象。
剩下的几种情况——函数、数组、对象、null、new Number(10)都是对象,他们都是引用类型。
2.函数与对象的关系--对象都是通过函数来创建的
3.prototype原型---每个函数function都有一个prototype,每个对象都有一个__proto__
4.隐式原型--每个对象都有一个__proto__属性,指向创建该对象的函数的prototype,Object.prototype确实一个特例——它的__proto__指向的是null
5..instanceof---instanceof表示的就是一种继承关系,或者原型链的结构
instanceof的判断队则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false
6.继承
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链
那怎么还有hasOwnProperty呢?——那是Function.prototype继承自Object.prototype的方法。有疑问可以看看上一节将instanceof时候那个大图,看看Function.prototype.__proto__是否指向Object.prototype
7.执行上下文
- 变量、函数表达式——变量声明,默认赋值为undefined;
- this——赋值;
- 函数声明——赋值;
这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。
函数每被调用一次,都会产生一个新的执行上下文环境
函数在定义的时候(不是调用的时候),就已经确定了函数体内部自由变量的作用域
在执行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值了,有的先用undefined占个空
8.this
在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了
9.执行上下文
处于活动状态的执行上下文环境只有一个
其实这是一个压栈出栈的过程——执行上下文栈
10.作用域--javascript除了全局作用域之外,只有函数可以创建的作用域。
我们在声明变量时,全局代码要在代码前端声明,函数中要在函数体一开始就声明好。除了这两个地方,其他地方都不要出现变量声明。而且建议用“单var”形式
作用域有上下级的关系,上下级关系的确定就看函数是在哪个作用域下创建的
作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突
作用域在函数定义时就已经确定了。而不是在函数调用时确定
作用域只是一个“地盘”,一个抽象的概念,其中没有变量。要通过作用域对应的执行上下文环境来获取变量的值。同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。所以,作用域中变量的值是在执行过程中产生的确定的,而作用域却是在函数创建时就确定了。
所以,如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。
11.自由变量到作用域链--要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用”
12.闭包---要去创建这个函数的作用域取值,而不是“父作用域”,函数的特别之处在于可以创建一个独立的作用域