JS作用域和闭包和原型链

118 阅读4分钟

模块之间相互调用,理清关系作用域

this的不同应用场景如何取值

手写bind函数

闭包的应用场景,复杂情况常用

10.实际开发中闭包的应用场景,举例说明

②函数防抖 ③使用闭包设计单例模式 ④设置私有变量

隐藏数据,不让外边去改变

做一个简单的cache工具:只能通过返回的函数改变对象属性(这个函数能访问定义时作用域的变量),无法直接修改

创建10个a标签点击时弹出相应序号

知识点

1. 作用域和自由变量

    作用域:变量的合法使用范围:全局,函数,块级(ES6作用域)

    自由变量:一个变量在当前作用域没有定义但被使用了

        向上级作用域一层一层依次寻找,直至找到为止,到全局都没有就返回undefined

1. 闭包

    作用域应用的特殊情况 : 函数定义的地方和函数执行的地方不一样

    - 函数作为参数被传递 

    - 函数作为返回值被返回 

    所有自由变量的查找是在函数定义的地方不是在执行的地方 

1. this

    - 普通函数

    - call apply bind

    - 作为对象方法被调用

        当前对象

        定时器里面函数执行this是window,因为相当于赋值给了新的变量由定时器来执行函数

    - class方法中被调用

        创建的实例

    - 箭头函数

        永远取上级作用域的this,本身不决定this

    this取值是在函数执行时确定而不是在定义时确定

JS是基于原型继承的语言

如何判断一个变量是不是数组(instanceof 原理)

instanceof Array,Array.isArray,Object.prototype.toString.call()

手写jQuery,考虑插件和扩展性(学习jQuery的设计方式)

class的原型本质的理解

ES5继承怎么实现属性隔离

知识点

- class和继承

    super这个关键字,既可以当作函数使用,也可以当作对象使用。

        第一种情况,super作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次super函数。作为函数时,super()只能用在子类的构造函数之中,用在其他地方就会报错。`super()在这里相当于A.prototype.constructor.call(this)` 返回的是子类B的实例

        第二种情况,super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例。`实际上执行的是super.print.call(this)。` this指向子类实例,所以如果通过super对某个属性赋值,这时super就是this,赋值的属性会变成子类实例的属性。

    Class 作为构造函数的语法糖,同时有prototype属性和__proto__属性,因此同时存在两条继承链。__proto__指向对应的构造函数的prototype

        子类的__proto__属性,总是指向父类。

        子类prototype属性的__proto__属性,总是指向父类的prototype属性。

        作为一个实例,子类(B)的原型(__proto__属性)是父类(A);作为一个构造函数,子类(B)的原型对象(prototype属性)是父类的原型对象(prototype属性)的实例。

- 类型判断instanceof

    前一个操作符的__proto__能不能对应到后一个操作符的prototype,而一个class的__proto__是父类,父类的__proto__最终指向Object.prototype

    ECMA不规定如何实现,只规定语法规则

- 原型和原型链

    画图 标题是prototype,key是__proto__指向上一个prototype

    实例__proto__和构造函数(class)的prototype指向同一个对象(存放方法)

    1. 先找自身属性和方法

    2. 找不到则去__proto__

    原型链:实例上没有去__proto__上找去了构造函数的prototype,构造函数的prototype上没有,继续找__proto__就是父类的prototype,也就是父类实例的__proto__,原型链顶部是Object.prototype有toString,valueOf等方法,它的__proto__指向null