返回

js闭包处理

前端

闭包是 JavaScript 中的一个重要概念,它允许函数访问其创建时所在的作用域中的变量,即使该函数已经被执行并已经离开其创建时的作用域。闭包通常用于创建私有变量和方法,以及创建回调函数。

一、变量的作用域

在 JavaScript 中,变量的作用域分为全局作用域和局部作用域。全局作用域是指在脚本中任何地方都可以访问的变量,而局部作用域是指在函数内声明的变量,只能在该函数内部访问。

例如,以下代码在全局作用域中声明了一个变量 x

var x = 10;

以下代码在函数 foo() 内部声明了一个变量 y

function foo() {
  var y = 20;
}

在函数 foo() 内部,可以访问变量 xy,而在函数 foo() 外部,只能访问变量 x,无法访问变量 y

二、闭包的创建

闭包是在函数内部创建的函数,它可以访问函数内部的变量,即使该函数已经被执行并已经离开其创建时的作用域。

以下代码创建了一个闭包:

function foo() {
  var x = 10;

  function bar() {
    return x;
  }

  return bar;
}

var baz = foo();

console.log(baz()); // 10

在函数 foo() 内部,声明了变量 x 和函数 bar()。函数 bar() 返回变量 x 的值。在函数 foo() 执行后,变量 x 被销毁,但函数 bar() 仍然可以访问变量 x 的值,因为函数 bar() 是一个闭包。

三、闭包的应用

闭包可以用于创建私有变量和方法,以及创建回调函数。

1. 创建私有变量和方法

闭包可以用来创建私有变量和方法,这些变量和方法只能在闭包内部访问。

以下代码使用闭包创建了一个私有变量 x

function foo() {
  var x = 10;

  function bar() {
    return x;
  }

  return bar;
}

var baz = foo();

console.log(baz()); // 10

console.log(x); // ReferenceError: x is not defined

在函数 foo() 内部,声明了变量 x 和函数 bar()。函数 bar() 返回变量 x 的值。在函数 foo() 执行后,变量 x 被销毁,但函数 bar() 仍然可以访问变量 x 的值,因为函数 bar() 是一个闭包。

在函数 foo() 外部,无法访问变量 x,因为变量 x 是私有的。

2. 创建回调函数

闭包可以用来创建回调函数,回调函数是在某个事件发生时被调用的函数。

以下代码使用闭包创建了一个回调函数:

function foo() {
  var x = 10;

  setTimeout(function() {
    console.log(x);
  }, 1000);
}

foo(); // 10

在函数 foo() 内部,声明了变量 x 和一个匿名函数。匿名函数使用 setTimeout() 函数延迟 1 秒执行。在函数 foo() 执行后,变量 x 被销毁,但匿名函数仍然可以访问变量 x 的值,因为匿名函数是闭包。

1 秒后,匿名函数被执行,它输出变量 x 的值 10。

四、小结

闭包是 JavaScript 中的一个重要概念,它允许函数访问其创建时所在的作用域中的变量,即使该函数已经被执行并已经离开其创建时的作用域。闭包通常用于创建私有变量和方法,以及创建回调函数。