- 一切(引用类型)都是对象,对象是属性的集合。
- 判断一个变量是否是对象。值类型(undefined,number,string,boolean)的类型判断用typeof,引用类型(函数,数组,对象,null,new Number)的类型判断用instanceof。其中typeof判断引用类型只有两个结果(object/function).
- 对象都是函数创建的,而函数是Function创建的,Function也是函数,函数也是一种对象。
- 每个函数function都有一个prototype,每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。__proto__指向的就是Object.prototype.但是Object.prototype却是一个特例,他的__proto__指向的是null。Object.__proto__===Function.prototype.
- instanceof表示的就是一种继承关系,或者原型链的结构。
- __proto__是任何对象都有的属性,而js是万物皆对象,所以会形成一条__proto__连起来的链条,递归访问__proto__必须最终到头,并且值为null。
- 访问一个对象的属性时,先在基础基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。
- 原型可以随时改动。
- JavaScript在执行一个代码片段之前,都会进行这些“准备工作”来生成执行上下文。
function fn(x){ console.log(x+5); } === var fn=new Function("x","console.log(x+5)");
- 11.函数每被调用一次,都会产生一个新的执行上下文环境。函数在定义的时候(不是调用)就已经确定了函数体内部自由变量的作用域。
- 12.代码段分三种情况:全局代码、函数体、eval代码(不推荐使用)。
- 13.全局代码的上下文环境数据内容为:
普通变量 声明(默认赋值为undefined) 函数声明 赋值 this 赋值 - 如果代码段是函数体,那么在此基础上需要附加:
参数 赋值 arguments 赋值 自由变量的取值作用域 赋值 - 执行上下文环境:在执行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值,有的先用undefined占个空。
- 执行上下文是调用函数时产生的,作用域是在函数创建时就产生的。
- 在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了。
- 构造函数:构造函数就是用来new的对象。构造函数的首字母大写,例如Object、Array、Function等。如果函数作为构造函数用,那么其中的this代表即将new出来的对象。
- 函数作为对象的一个属性:如果函数作为对象的一个属性时,并且作为对象的一个属性被调用时,函数中的this指的是window。
- 函数用call或者apply调用:此时this的值取传入的对象的值。
- 全局&调用普通函数:在全局环境下,this指向window,调用普通函数,this也是指向window。
- 执行上下文栈:处于活动状态的执行上下文环境只有一个。这是一个压栈出栈的过程。
- JavaScript没有块级作用域:
- JavaScript除了全局作用域之外,只有函数可以创建作用域。
- 声明变量时,全局代码要在代码前端声明,函数中要在函数体一开始就声明好。用单var形式声明变量。
- 作用域有上下级的关系,上下级关系的确定就看函数是在哪个作用域下创建的。
- 作用域最大的用处就是隔离变量,不同作用域下同名变量不会冲突。
- 如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。
- 要在创建这个函数的那个作用域中取值----是创建而不是调用
- 作用域链过程:
- 先在当前作用域查找a,如果有则获取并结束,如果没有则继续;
- 如果当前作用域是全局作用域,则证明a未定义,结束;否则继续;
- 将创建该函数的作用域作为当前作用域;
- 跳转到第一步。
- 闭包分两种情况:
- 函数作为返回值
- 函数作为参数被传值。
var max=10, fn=function(x){ if(x>max){ console.log(x); } }; (function(f){var max=100;f(15);})(fn);