- new一个对象的过程–【口诀:心跳定直返】
- 首先创建一个新对象son,例如:var son = new Mother(”Da“);
- 新对象调用__proto__属性指向原型,即Mother.prototype
- 将新对象与函数调用的this绑定起来
- 执行构造函数中代码
- 如果函数没有返回值,就会返回这个新对象
- 如何准确判断一个变量是数组类型
使用instanceof来判断
- this关键字
- 默认绑定,调用的位置是全局,且声明中没有定义变量,则会默认声明中的this指全局的window
- 隐式绑定,声明中明确指出定义变量var aa,则this指该变量对象。如果调用的方法在全局,但this不能看全局。this.后面的东西要看调用变量下有没有,而this关注有没有var一下
- 硬绑定,声明A中指出了定义变量name和方法sayName,但与此同时,还有一个声明B也定义变量name,如果A调用sayName方法的时候写成A.sayName.call(B)或A.sayName.apply(B)时,this将指B中的name,而非A中的name
- 构造函数绑定,在3的基础上,如果将A通过new实例化后,便后面调用A时this永远指的是A中的name
4.执行上下文
- 分为创建阶段和执行阶段
- 创建阶段需要关注的是作用域链(当前的变量对象和所有父集变量对象),变量对象(参数,变量,函数声明),this
- 执行阶段需要关注的是变量赋值,函数引用等。
5.闭包
- 匿名函数可以访问到外部变量
- 由于JavaScript是单线程的,所以出现了任务队列的机制。如果用到了setTimeOut,即使间隔时间写为0,也会先将setTimeOut中的代码块由浏览器先处理,将处理结果放到任务队列。等到执行栈完成后才会执行任务队列
6.块级作用域
- 这是JavaScript的一个大坑,一般来说,大括号括起来的代码是封闭的,当执行完后,里边的变量会被释放。但在JavaScript里if执行完后,if里面的变量会变成当前执行的变量,if中的变量成为全局变量。
- 对于for 和 while 和if是一样的
- 在JavaScript中定义变量无论写在哪都会默认到第一行,但是赋值不会
- 函数和变量定义一样,也会被提升,但是函数会优先于变量提升