1.闭包:
闭包:函数,可以访问局部变量;即便外部函数已经“调用完毕/关闭”
闭包形成的条件:
1,函数嵌套
2.将内部函数作为返回值返回
3.内部函数必须使用到外部的变量
-
1.闭包的描述
-
2.闭包的使用场景举例
1.函数内部的变量外部是无法访问的,但是可以通过返回一个闭包,外部操作闭包来间接访问函数内部的变量,闭包可以决定这个变量的操作方式
2.利用了函数每次调用时生成的独立调用栈,利用函数的形参保存临时变量的值(比如for循环内部如果有延时获取变量i的情况,因为for不具有作用域,i取值不真实,然后就可以采用闭包这个方法)
3.利用函数的独立作用域,来生成业务代码块(把业务代码用函数封装起来,形成业务代码块),内部的变量相互不冲突污染全局变量(就是自调用不会影响全局)
4.可以把一个闭包封装到原型中,这样每一个对象都可以共用闭包工具
5.回调函数,利用函数复用的功能,制作复用工具,参数返回值
-
3.闭包的看法(优点,缺点:解决方法)
优点:
1.函数内部的变量,想要被外部程序使用,但是语法决定了外部不能使用,可以利用闭包解决; 2.一些临时数据,比如for循环的i的值,希望延时业务中使用,可以使用闭包解决 3.防止变量污染,可以用闭包把一些业务变量放在局部作用域中
缺点:闭包使用不对,会有致命的问题:内存泄漏
解释:
1.浏览器的内存管理机制:垃圾回收机制,引用计数,底层浏览器的代码实现的功能(系统会定期查看我们的js执行情况,观察创建的对象有没有可能会被使用,如果没有可能,就释放内存,每一个对象都有“人”引用它,如果引用的“人”数为0就释放内存)
2.内存泄漏:
1.浏览器运行网页,就会执行js代码,引用数据会在内存中占用内存空间(如果有一个对象创建了,而且占用了内存,但没有被什么业务使用,这就是内存泄漏) 2.比如函数内部有一个对象,内部的函数引用了这个对象,返回这个函数,然后外部作用域也可以通过这个闭包操作内部的对象,因此函数调用完毕之后,本该释放的对象内存空间,由于外部作用域还在,内部的对象就不会释放,而后面的代码没有再操作过内部的对象,这个对象的内存会一直占用,但是却未被使用,这个就导致了内存泄漏内存泄漏的解决方案:
1.尽量避开,不要使用闭包 2.在可能存在泄漏的地方把标识符引用为null(引用置空) -
4.真实的你在项目中哪个使用了
劫持
劫持:就是在一个函数运行之前把它劫持下来,添加我们想要的功能
分类:有下面三种劫持:
1.系统的内置功能的重写:就是将系统内置函数功能修改为自己想要实现的功能;也就是系统内置函数的改写
2.this关键字的引用劫持:通过函数的一些特殊方法来自己指定函数的调用者
3.黑客劫持网络数据包,然后暴力解码(逆向工程),个人隐私数据窃取
1.系统的内置功能的重写(系统原本的功能不改变,在这个的基础上添加自己想实现的功能):1.控制台打印
例:
2.this关键字的引用劫持:偷方法者相当于this指向谁
先复习一下以前的,便于理解:
1.call(偷方法者,参数,参数...)方法:(偷方法)从第二个开始代表函数运行时传入的参数
2.apply(偷方法者,[参数,参数,参数...])方法:与call方法基本一致,区别在于,apply方法的所有参数需要放在一个数组中传入进去。
3.bind(调用者,参数,参数...)方法:定义式的函数可以在设计的时候就指定this
注意:bind()的优先级比前面两个的劫持方法apply(),call()的优先级高