2022-07-26

1、this指向问题
(1)全局作用域下 this指向window
(2)箭头函数中的this指向上下文
(3)构造函数中的this指向调用者
(4)当某个函数为对象的⼀个属性时,在这个函数内部this指向这个对象
(5)当⼀个元素被绑定事件处理函数时,this指向被点击的这个元素
(6)严格模式下全局作用域中this指向undefined
2、改变this指向的三个方法
call apply bind
相同点:
都是用来改变函数的this对象的指向的,第一个参数都是this要指向的对象,都可以利用后续参数传参
不同点:
call/apply 可以直接执行该函数,而 bind 不会立刻执行。
bind 与前两者作用类似,都是改变函数内部的 this 指向,区别在于 bind 会创建一个新的函数实例,每次调用该实例时,都会在被绑定的环境中运行。简单来说就是,bind方法返回一个新函数,以后调用了才会执行,但apply、call会立即执行。
call和apply的区别在于,call可以传递多个参数,而apply只能传递两个参数,第二个参数以数组的形式进行接收。
call和apply的第一个参数如果是null和underfined this指向window。
3、什么是闭包,闭包的优缺点?
闭包就是能够读取其他函数内部变量的函数,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数”。
闭包的用途:
1.可访问函数内部的变量
2.在内存中维持一个变量。防止函数内部的变量执行完成后,被销毁,使其一直保存在内存中。

闭包的缺点:
滥用闭包会造成内存泄露
因为闭包中引用到的包裹函数中定义的变量永远不会被释放
所以我们不再改变量或函数的时候应该及时释放这个闭包函数。(使该函数等于null)

//1. 用最外层的函数来包裹内层函数和受保护的变量
        function parents(){
            var total=1000;
            //2. 将内部的函数对象return到外部
             return function(num){
                 total-=num;
                 document.write(`花了${num}元,还剩下${total}元
`); } } //3. 调用外部函数来获得内层函数,并保存在一个外部变量中 var child=parents(); console.log(child); child(100); child(200);

4、如何解决内存泄漏?
内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
通俗点就是指由于疏忽或者错误造成程序未能释放已经不再使用的内存,不再用到的内存却没有及时释放,从而造成内存上的浪费。
造成内存泄漏的几种情况:

  1. 定义全局变量
    解决方式:使用 var let const 来定义变量。或者在js文件开头添加 ‘use strict',开启严格模式。
    2.闭包 在使用闭包的时候,就会造成严重的内存泄漏,因为闭包中的局部变量,会一直保存在内存中。
    解决方式:使该函数等于null。
    3.定时器
    定时器setInterval或者setTimeout在不需要使用的时候,没有被clear,导致定时器的回调函数及其内部依赖的变量都不能被回收,这就会造成内存泄漏。
    解决方式:当不需要interval或者timeout的时候,调用clearInterval或者clearTimeout
    4.事件监听 DOM.addEventListener("click", callback)
    垃圾回收机制不好判断该事件是否需要被解除,导致 callback 不能被释放,此时需要手动解除绑定:DOM.removeEventListener(callback)
    5.元素引用没有清理
var a = document.getElementById('id');
document.body.removeChild(a);
// 不能回收,因为存在变量a对它的引用。虽然我们用removeChild移除了,但是还在对象里保存着#的引用,即DOM元素还在内存里面。
解决方法: a = null;

6.console
控制台日志记录对总体内存内置文件的影响,也是个重大的问题,同时也是容易被忽略的。记录错误的对象,可以将大量的数据保留在内存中。
传递给console.log的对象是不能被垃圾回收,所以没有去掉console.log可能会存在内存泄漏

5、如何解决跨域?
首先,在不同源的情况下才会发生跨域,不同源是指协议、域名、端口不同,解决跨域的方案有以下几种:
1.JSONP跨域
jsonp的原理就是利用

你可能感兴趣的:(2022-07-26)