当前位置: 首页 > Web前端 > JavaScript

day22-闭包与继承

时间:2023-03-27 12:27:59 JavaScript

day22-闭包与继承一、闭包闭包的形成原理闭包:是作用域嵌套不破坏执行空间的场景闭包的形成:通常由一个大函数嵌套一个小函数,小函数使用大函数的变量,并在大函数外部与小函数建立引用关系,函数执行是先在调用栈中形成一个独立的空间,然后执行这个空间中的代码。当空间中的代码被执行时,空间中的代码与全局代码没有关联,空间就会被销毁。以下代码进入调用栈执行,执行完弹出栈。..闭包:全局定义b变量,接收本地返回的小函数。只要全局变量还存在,局部的小函数就一直存在。如果small函数存在,f1的空间一定一直存在,f1的空间一定一直存在如果存在,f1中的变量a就一直存在,调用全局b函数,执行f1中的small函数,变量在f1访问的小函数中,多次调用实际上访问的是同一个变量aClosure优缺点:全局可以操作局部变量;延长变量的生命周期;保护变量的隐私缺点:闭包的执行空间没有被破坏,如果滥用闭包会造成内存泄漏/溢出(代码留在内存中没有被破坏,内存满了,其他代码不能执行)----要破坏这个执行空间,可以将全局接收小函数的变量赋值给空闭包应用场景a。循环执行异步代码,在异步代码变量b中使用循环。防抖C.节流D.functionCurry防抖当一些操作被频繁触发,而我们只需要最后一次时,在js中需要一个关键字arguments——用来接受所有argumentsdocument.onmousemove=fn(1000,function(e){document.querySelectorAll('span')[0].innerText=e.pageXdocument.querySelectorAll('span')[1].innerText=e.pageY})functionfn(time,handler){vartimerreturnfunction(){var_this=这个var_arguments=argumentsclearInterval(timer)timer=setTimeout(function(){handler.call(_this,..._arguments)},time)}}throttling当一些操作被频繁触发时,使用throttlingdocument.onmousemove=fn(1000,function(e){document.querySelectorAll('span')[0].innerText=e.pageXdocument.querySelectorAll('span')[1].innerText=e.pageY})functionfn(time,handler){varstarTime=+newDate()返回函数(){varendTime=+newDate()if(endTime-starTime>=1000){handler.call(this,...arguments)starTime=endTime}}}functioncurryCurrying:一个函数应该有多个参数,变换这个函数,让这个函数值传递一个参数,实现原函数,传递多次functionfn(a){returnfunction(b){returnfunction(c){返回函数(d){返回a+b+c+d}}}console.log(fn(1)(2)(3)(4)===10);一、继承允许一个对象拥有其他对象的属性和方法1、原型继承通过修改对象的原型,让对象拥有其他对象的方法。缺点:继承的属性是在原型上,而不是在自身上。给自己添加同名属性时,不能使用原型的属性2.借函数继承在子构造函数中调用父构造函数,将this改为子构造函数的this。缺点:只能继承构造函数中给定的属性,不能继承父对象原型上的方法3.结合继承原型+借用3.es6继承ES6提供了class关键字来定义一个类:抽象对象类——构造函数object:实例化类对象--实例对象--新建对象写这个。propertyname=value}methodname(){}}继承语法:classSubclassextendsparentclass{}注意:当子类有构造函数时,子类的构造函数中必须先调用super()classPersonextendsAnimal{constructor(age,n){super(n)//super其实就是在调用父类的构造函数this.age=age}}