欢迎访问宙启技术站
智能推送

函数作用域和闭包:了解函数内部数据的可见性

发布时间:2023-06-23 22:50:47

函数作用域和闭包是 javascript 中两个重要的概念,两者“有机结合”,形成了现代 javascript 开发中一个非常重要的编程模式。函数作用域指的是变量和函数的可见性。闭包指的是函数的调用环境不会被销毁,因此可以在该环境外使用函数中的数据和变量。下面就来具体了解一下这两个概念。

函数作用域:

1、理解作用域:

作用域是指变量和函数的可见性,即它们所在的范围。函数作用域是指函数内声明的变量和函数,在函数外部不可见,因此它们存在于函数的局部作用域中。作用域可以分为两种:全局作用域和局部作用域。

全局作用域是指变量和函数在整个程序中都可用,而局部作用域是指它们只在函数内部可用。函数作用域指的是变量的可见性。如果变量在函数内部声明,则只能在函数内部被访问,而在函数外部声明,则可以在全局范围内访问。

例如:

var a = 1;
function foo() {
  var b = 2;
  console.log(a); // 1
  console.log(b); // 2
}
foo();
console.log(a); // 1
console.log(b); // Uncaught ReferenceError: b is not defined

在上述例子中,全局变量 a 可以被函数内、外的所有代码访问,而局部变量 b 只能在函数内部访问。

2、变量提升:

在javascript中,所有的变量和函数都会被提升到当前作用域的顶部。也就是说,无论变量和函数的声明在代码的哪个位置,都会被解释器移动到当前作用域的顶部进行处理。这种行为被称为“变量提升”。

例如:

foo(); // 1
var a = 1;
function foo() {
  console.log(a); 
}

在这个例子中,我们会发现在函数 foo() 被调用的时候,变量 a 还没有被声明,但是仍能访问。这是因为函数 foo() 和变量 a 都被提升到了当前作用域的顶部,因此,foo() 中可以访问到 a。

3、块级作用域:

在 ES6 中引入了 let 和 const 关键字来声明变量,它们与 var 不同处在于它们都有块级作用域。块级作用域是指变量和函数只在当前块中可用,它们不会被提升到所在作用域的顶部。

例如:

{
  let a = 1;
  const b = 2;
  var c = 3;
}
console.log(a); // Uncaught ReferenceError: a is not defined
console.log(b); // Uncaught ReferenceError: b is not defined
console.log(c); // 3

在这个例子中,变量 a 和 b 均在块级作用域内,无法在块外访问,而变量 c 在块外也可访问。

闭包:

闭包是一个非常常见的概念,它是指一个函数能够访问其外部作用域的变量时,即使该函数已经执行完毕,这些变量仍然能够存在于内存中。换句话说,闭包可以让一个函数访问另一个函数的内部变量,并将其“保持在内存中”。

闭包的应用场景有很多,其中最常见的是用于存储变量或者状态。例如:

function counter() {
  var count = 0;
  return function() {
    count++;
    console.log(count);
  }
}
var c = counter();
c();
c();
c();

在这个例子中,函数 counter() 返回了一个函数,该返回函数在每次调用时都会增加 count 变量的值并输出,而 count 变量在 counter() 函数执行完毕后仍然会被保持在内存中,直到程序结束或该函数不再被使用。

结语:

函数作用域和闭包是 javascript 中非常重要的概念,它们决定了变量和函数的可见性和存储方式,因此在编写代码时务必要注意它们的作用和运作机制。同时,这两个概念也是面试中常见的问题,掌握它们可以让你在面试中更加得心应手。