day22-闭包和继承

一、闭包

  1. 闭包造成原理
    闭包:是因为作用域嵌套造成的一种执行空间不被销毁的场景
    闭包造成:通常是由大函数嵌套小函数,小函数应用大函数的变量,在大函数外跟小函数产生援用关系

    平时函数调用在内存中的执行流程: js执行代码是在 调用栈(call stack) 内存中执行的,函数执行是先在调用栈中造成一个独立的空间,而后在这个空间中执行代码,当空间中的代码执行完结后,空间中的代码跟全局代码无关联,就会销毁这个空间,上面的代码进入调用栈执行,执行完结出栈 。。。

      闭包:    全局定义b变量,接管部分中返回的小函数,只有全局变量还存在,部分中的小函数就会始终存在 ,小函数要存在,f1的空间就必须始终存在,f1的空间要始终存在,f1中的变量a就会始终存在,调用全局b函数,执行f1中的小函数,小函数中拜访的f1中的变量,屡次调用其实拜访的是同一个变量a
  2. 闭包优缺点
    长处:全局能够操作部分的变量;缩短了变量的生命周期;爱护了变量的公有性

      毛病:闭包的执行空间不销毁,如果滥用闭包会造成内存泄露/溢出(代码停留在内存中不销毁,导              致内存满了,执行不了其余代码)----要销毁这个执行空间,能够将全局接管小函数的变量赋值为null
  3. 闭包利用场景
    a.在循环中执行异步代码,在异步代码中应用循环的变量
    b.防抖
    c.节流
    d.函数柯里化
  4. 防抖
    当某些操作频繁被触发,而咱们只须要最初一次的时候就须要防抖

     js中有一个关键字arguments--用于承受所有的实参   document.onmousemove = fn(1000, function (e) {                            document.querySelectorAll('span')[0].innerText = e.pageX                  document.querySelectorAll('span')[1].innerText = e.pageY        })       function fn(time,handler) {                       var timer                       return function() {                                   var _this = this                                    var _arguments = arguments                                   clearInterval(timer)                                    timer = setTimeout(function() {                                        handler.call(_this,..._arguments)                                    },time)                       }           }
  5. 节流
    当某些操作频繁被触发,不须要这么频繁的时候应用节流
    document.onmousemove = fn(1000, function (e) {

          document.querySelectorAll('span')[0].innerText = e.pageX              document.querySelectorAll('span')[1].innerText = e.pageY    

    })
    function fn(time, handler) {

           var starTime = +new Date()              return function () {                           var endTime = +new Date()                           if(endTime - starTime >= 1000) {                                       handler.call(this,...arguments)                                      starTime =  endTime                            }               }   }
  6. 函数柯里化
    柯里化:一个函数原本应该有多个参数,将这个函数革新,让这个函数值传递一个参数,要实现本来 的性能,就传递屡次

      function fn(a) {              return function(b) {                           return function(c) {                                       return function(d) {                                                   return a + b + c + d                                        }                       }           }    console.log(fn(1)(2)(3)(4) === 10);

一、继承

    让一个对象领有其余对象的属性和办法

1.原型继承

   通过批改对象的原型,让对象领有其余对象的办法    弊病: 继承来的属性在原型上,不在本人上,当给本人增加同名属性时,就无奈应用原型的属性了。

2.借用函数继承

    在子构造函数中通过call调用父构造函数并扭转其中的this为子构造函数的this     弊病:只能继承构造函数中给的属性,无奈继承父对象的原型上的办法

3.组合继承

    原型+借用

3.es6的继承

    es6提供了class关键字用来定义类            类:形象的对象                    类--构造函数            对象:实例化的类                 对象--实例对象--new进去的对象            class语法:    class 类名{                             //定义属性有两种写法                                属性名 = 值                 //第一种写法                                      constructor() {            //第二种写法                                             this.属性名 = 值                                         }                                         办法名() {         }                                     }        继承语法:class 子类 extends 父类{}            留神:当子类有constructor的时候,在子类的constructor中的最后面,必须先调用super()        class Person extends Animal{                    constructor(age, n) {                                 super(n) // super其实就是在调用父类的constructor                                 this.age = age                     }         }