带你读《现代Javascript高级教程》二、执行上下文与闭包(1)

简介: 带你读《现代Javascript高级教程》二、执行上下文与闭包(1)

二、执行上下文与闭包

1. 由来

JavaScript中的闭包源于计算机科学中的一种理论概念,称为“λ演算”(Lambda Calculus)。λ演算是计算机科学的基础之一,1930年由Alonzo Church提出,它是一种用于描述计算过程的数学抽象模型,也是函数式编程语言的基础。

 

在JavaScript中,闭包是函数和声明该函数的词法环境的组合。这个环境包含了闭包创建时所能访问的所有局部变量。

 

理解闭包,需要理解JavaScript的特性和工作原理。JavaScript的函数在创建时,就确定了其操作的上下文环境,即词法作用域。这是因为JavaScript采用的是静态作用域,也叫词法作用域,函数的作用域在函数定义的时候就决定了。

 

例如:

function outer() {
    var name = 'JavaScript';
    function inner() {
        console.log(name);
    }
    return inner;}
var innerFunc = outer();innerFunc(); // 输出 'JavaScript'

 

在这个例子中,outer函数返回了inner函数。inner函数访问了outer函数的局部变量name,因此形成了一个闭包。即使outer函数执行完毕,name变量的引用仍然被保留,因此innerFunc在执行时仍然能够输出 'JavaScript'。

 

闭包的概念虽然来自计算机科学的深层理论,但在日常的JavaScript编程中,它是一个非常实用且常见的特性,被广泛用于如数据隐藏和封装、模块化编程、回调函数和计时器等许多场景中。


2.JavaScript中的闭包


在JavaScript中,闭包是一个强大而复杂的特性,理解和利用好闭包对于编写高效且安全的代码至关重要。下面就让我们深入地了解一下JavaScript的闭包。

闭包是指那些能够访问自由变量的函数。什么是自由变量呢?如果一个变量在函数内部被引用,但它既不是函数的参数也不是函数的局部变量,那么就称之为“自由变量”。

 

例如,我们有一个外部函数和一个内部函数:

 

function outerFunction(outerVariable) {
  function innerFunction() {
    console.log(outerVariable);
  }
  return innerFunction;}
var inner = outerFunction('Hello Closure');inner(); // 输出 'Hello Closure'

 

在这个例子中,outerFunction是一个外部函数,接受一个参数outerVariable。它包含一个内部函数innerFunction,这个内部函数没有自己的参数或局部变量,但却引用了外部函数的变量outerVariable。所以,我们说innerFunction是一个闭包,而outerVariable就是它的自由变量。

 

需要注意的是,由于JavaScript的垃圾回收机制,如果一个变量离开了它的作用域,那么这个变量就会被回收。但是,由于innerFunction是一个闭包,它引用了outerVariable,所以即使outerFunction执行完毕,outerVariable离开了它的作用域,但仍然不会被垃圾回收机制回收。

 

再者,每次调用外部函数,都会为内部的闭包创建一个新的作用域。例如:

 

var inner1 = outerFunction('Hello Closure 1');
var inner2 = outerFunction('Hello Closure 2');
inner1(); // 输出 'Hello Closure 1'
inner2(); // 输出 'Hello Closure 2'

 

这里,inner1inner2是两个不同的闭包。他们分别有自己的作用域,储存了不同的outerVariable


带你读《现代Javascript高级教程》二、执行上下文与闭包(2)https://developer.aliyun.com/article/1349707?groupCode=tech_library

相关文章
|
30天前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理与实战
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理与实战
|
15天前
|
JavaScript 前端开发
js 闭包的优点和缺点
【10月更文挑战第27天】JavaScript闭包是一把双刃剑,在合理使用的情况下,它可以带来很多好处,如实现数据封装、记忆功能和模块化等;但如果不注意其缺点,如内存泄漏、变量共享和性能开销等问题,可能会导致代码出现难以调试的错误和性能问题。因此,在使用闭包时,需要谨慎权衡其优缺点,根据具体的应用场景合理地运用闭包。
104 58
|
30天前
|
存储 JavaScript 前端开发
深入理解 JavaScript 执行上下文与 this 绑定机制
JavaScript 代码执行时,会为每段可执行代码创建对应的执行上下文,其中包含三个重要属性:变量对象、作用域链、和 this。本文深入剖析了执行上下文的生命周期以及 this 在不同情况下的指向规则。通过解析全局上下文和函数上下文中的 this,我们详细讲解了 this 的运行期绑定特性,并展示了如何通过调用方式影响 this 的绑定对象。同时,文中对箭头函数 this 的特殊性以及四条判断 this 绑定的规则进行了总结,帮助开发者更清晰地理解 JavaScript 中的 this 行为。
71 8
深入理解 JavaScript 执行上下文与 this 绑定机制
|
15天前
|
缓存 JavaScript 前端开发
js 闭包
【10月更文挑战第27天】JavaScript闭包是一种强大的特性,它可以用于实现数据隐藏、记忆和缓存等功能,但在使用时也需要注意内存泄漏和变量共享等问题,以确保代码的质量和性能。
34 7
|
11天前
|
自然语言处理 JavaScript 前端开发
如何在 JavaScript 中创建执行上下文
在JavaScript中,每当执行一段代码时,都会创建一个执行上下文。它首先进行变量、函数声明的创建和内存分配(即变量环境和词法环境的建立),接着进入代码执行阶段,处理具体逻辑。
|
17天前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包:解锁编程潜能,释放你的创造力
【10月更文挑战第25天】本文深入探讨了JavaScript中的闭包,包括其基本概念、创建方法和实践应用。闭包允许函数访问其定义时的作用域链,常用于数据封装、函数柯里化和模块化编程。文章还提供了闭包的最佳实践,帮助读者更好地理解和使用这一强大特性。
12 2
|
11天前
|
存储 自然语言处理 JavaScript
如何在 JavaScript 中创建执行上下文
在JavaScript中,作用域链是一套用于查找变量和函数的机制,由当前执行上下文的变量对象和所有外层执行上下文的变量对象组成。它包括全局作用域、函数作用域和块级作用域。作用域链的工作原理是从内向外逐层查找变量,直至全局作用域。闭包通过作用域链记住其词法作用域,即使在外部作用域之外执行也能访问内部变量。作用域链有助于变量隔离、模块化和数据隐藏,提高代码的可维护性和可读性。
|
30天前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理、应用与代码演示
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理、应用与代码演示
|
1月前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript闭包:原理与应用
【10月更文挑战第11天】深入理解JavaScript闭包:原理与应用
19 0
|
JavaScript 前端开发
JavaScript核心概念之执行上下文和栈
Emm… 这个概念非常的抽象,简单来说呢,就是 JS 在执行某段代码的时候做的一些事情。
94 0
JavaScript核心概念之执行上下文和栈