1、call、apply、bind
- 都是用于改变函数的this指向
- 第一个参数是绑定的this,后面的参数是传递的参数
- call和bind,逐个传递参数。
- apply,接收的参数是一个数组。
- call和apply是立即执行的,bind返回的是一个函数,需要执行一下。
const info1 = { name: '张三' };
let name = '王五';
// console.log(this);
function info2(age, sex) {
let name = '李四';
console.log(`姓名: ${this.name}`);
console.log(`年龄: ${age}`);
console.log(`性别: ${sex}`);
}
info2.call(info1, '19', '男');
info2函数通过call方法被调用,call方法的第一个参数指定了函数内部this的指向,即info1对象。因此,在info2函数执行时,this指向info1对象。call方法的后续参数(这里是'19'和'男')将作为info2函数的参数传递。
2、闭包
闭包是定义在函数内部的函数 闭包可以访问并操作其函数外部,及父级函数外部的变量。
let c = 2;
function fn1() {
let a = 1;
function fn2() {
a++;
console.log(a, 'a');
console.log(c, 'c'); //2
}
return fn2;
}
const fn2 = fn1();
//闭包函数执行完后外部作用域变量仍然存在,并保持状态
fn2(); //2
//这里再次调用fn2,a++是2+1是3,说明闭包中的参数,是不被垃圾回收机制所回收的
//说明闭包是能够“记住”并访问它们创建时所在的词法作用域的函数,即使这些函数是在该作用域之外执行的。
fn2(); //3
//这里说明每次创建,都是一个新的函数,这里是创建了另外一个闭包
const fn3 = fn1();
fn3(); //2
//2 a
//2 c
//3 a
//2 c
//2 a
//2 c
缺点:
- 内存占用:闭包会导致外部函数的变量无法被垃圾回收,从而增加内存占用。如果滥用闭包,会导致内存泄漏问题。
- 性能损耗:闭包涉及到作用域链的查找过程,会带来一定的性能损耗。在性能要求高的场景下,需要注意闭包的使用。
场景:
节流、防抖、遍历树结构的数据等。 闭包中的数据不能被垃圾回收机制所回收,但是是可以手动释放的。