js

42 阅读2分钟

1、call、apply、bind

  1. 都是用于改变函数的this指向
  2. 第一个参数是绑定的this,后面的参数是传递的参数
  3. call和bind,逐个传递参数。
  4. apply,接收的参数是一个数组。
  5. 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

缺点:

  1. 内存占用:闭包会导致外部函数的变量无法被垃圾回收,从而增加内存占用。如果滥用闭包,会导致内存泄漏问题。
  2. 性能损耗:闭包涉及到作用域链的查找过程,会带来一定的性能损耗。在性能要求高的场景下,需要注意闭包的使用。

场景:

节流、防抖、遍历树结构的数据等。 闭包中的数据不能被垃圾回收机制所回收,但是是可以手动释放的。

3、箭头函数

4、回调函数