JavaScript 中的作用域与闭包

yizhihongxing

作用域 (Scope) 是 JavaScript 代码中的一个重要概念。它定义了变量和函数的可见度以及使用的方式。在 JavaScript 代码中,有着局部作用域和全局作用域。使用作用域可以让代码更加封闭和安全,同时也增加了代码的可读性。

一、作用域的概念

  • 全局作用域: 全局作用域是指在 JavaScript 代码中所有的地方都能访问到的变量、函数和对象;
  • 局部作用域: 局部作用域是指定义在函数内部的变量、函数和对象,在函数内部可以正常使用,但在函数外部则无法访问。

JavaScript 中作用域的划分是基于其代码结构中的函数作用域及块级作用域的规则。

二、函数作用域

在 JavaScript 中,只有函数会产生新的作用域。即,在函数内部定义的变量和函数只能被该函数内部访问,而在函数外部是无法访问的。这就是所谓的“函数作用域”。下面是一个例子。

function func(){
    const a = 1;
    console.log(a);
}
func();
console.log(a); // 报错:a未定义

在上述代码中,变量 a 属于函数 func 内部的作用域,并不能被函数外部访问到。

三、闭包 (Closure)

闭包是指一个函数可以访问到它所在外部的作用域,即使这个函数在外部作用域中已经被销毁了,它仍然能够访问到外部作用域的变量和函数。闭包是一种强大的工具,能够极大地增强 JavaScript 的编程能力。

下面是一个使用闭包的例子:

function outer(){
    const a = 1;
    function inner(){
        console.log(a);
    }
    return inner;
}
const foo = outer();
foo(); // 1

在上述代码中,函数 inner 定义在函数 outer 内部,并返回了 inner 函数。当 outer 函数被执行时,内部变量 a 和函数 inner 随之创建,随后返回 inner 函数。此时,outer 函数的执行已经结束,但是 outer 函数内的变量 a 和函数 inner 的作用域仍然存在于内存中。当使用 foo() 执行 inner 函数时,实际上就是在外部的作用域中访问了内部作用域的变量 a 的值。

四、闭包的应用

闭包在实际开发中有着广泛的应用,例如:IIFE、模块化、缓存和异步编程等。

1. IIFE

立即调用函数表达式(IIFE)就是一个典型的闭包的应用。

IIFE 的形式如下:

(function(){
    // 这里是函数体,可以进行一些内部操作
})();

IIFE 能够在不污染全局命名空间的情况下,执行一些内部操作或定义一些局部变量。

2. 模块化

使用闭包可以实现模块化开发。例如,下列代码实现了一个简单的模块化开发方式:

const moduleA = (function(){
    const a = 1;
    function foo(){
        console.log(a);
    }
    return {
        foo: foo
    };
})();
moduleA.foo(); // 1

在上述代码中,使用闭包创建了模块 A。模块 A 中定义了变量 a 和函数 foo(),然后使用对象字面量返回了访问这些方法的接口。在最后使用 moduleA.foo() 访问了 foo() 方法。

3. 缓存

利用闭包,可以实现缓存。

function cache(){
    const data = {};
    return function(key, value){
        if (value !== undefined){
            data[key] = value;
        } else {
            return data[key];
        }
    };
}
const c = cache();
c('name', 'Jack');
console.log(c('name')); // Jack

在上述代码中,cache 函数中定义了局部变量 data,data 可以缓存任意类型的数据。在 c 函数中通过 key/value 访问 data 对象中的值。如果只传入 key 则返回 data 对象中的值,如果同时传入 key 和 value 则将 key-value 对添加到 data 对象中。

4. 异步编程

在异步编程中,闭包经常用来捕获异步操作的上下文状态。

for (var i = 0; i < 5; i++){
    setTimeout((function(j){
        return function(){
            console.log(j);
        };
    })(i), 1000);
}

在上述代码中,使用闭包,可以捕获循环中的变量 i。每次创建一个新的立即调用函数表达式,将变量 i 的值作为参数传入,并在函数作用域中记录下来。当 setTimeout 执行函数时,就可以访问到正确的变量 i 值。从而能够输出 0、1、2、3、4。

总结

作用域和闭包是 JavaScript 中重要的概念,在编写 JavaScript 代码时,正确理解和使用作用域和闭包,可以提高代码的质量和可读性。在实际开发中,我们应该灵活应用作用域和闭包,从而更好地完成工作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript 中的作用域与闭包 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • JavaScript常用数组元素搜索或过滤的四种方法详解

    JavaScript常用数组元素搜索或过滤的四种方法详解 在JavaScript编程中,经常会对数组进行搜索或者过滤操作,这篇文章将向您介绍JavaScript中常用的四种搜索或过滤数组元素的方法。 1. find()方法 该方法用于搜索数组中符合条件的元素,找到则返回该元素值,否则返回undefined。遍历数组,找到符合条件的元素即终止遍历,该方法接收一…

    JavaScript 2023年5月27日
    00
  • 基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)

    首先讲一下所需工具: touch.js:一款轻量级的移动端手势库,用于实现图片的缩放、滑动等手势操作; Zepto.js:一款轻量级的JavaScript库,可用于DOM操作、事件绑定等常见操作。 如果你已经准备好了这些工具,接下来我们就可以开始制作基于touch.js和Zepto.js的图片查看器了。 步骤一、创建HTML结构 首先我们需要先创建出HTML…

    JavaScript 2023年6月11日
    00
  • js字符串倒序的实例代码

    下面就是详细讲解“js字符串倒序的实例代码”的完整攻略了。 1. 文章说明 本文旨在介绍如何使用JavaScript实现将字符串倒序输出的方法。字符串倒序输出是指将原字符串中的字符反转过来,使得原本在第1个位置的字符出现在倒数第1个位置上,原本在第2个位置的字符出现在倒数第2个位置上,依此类推。 2. 方法一 下面是一段比较简单的代码实现: function…

    JavaScript 2023年5月28日
    00
  • JavaScript的parseInt 取整使用

    下面是关于JavaScript中parseInt方法的取整使用的完整攻略: 什么是 parseInt 方法 parseInt 方法是 JavaScript 内置的一个函数,用来将一个字符串转换成整数(Number)。 它的语法格式如下: parseInt(string, radix) 其中: string:需要转换成整数的字符串。 radix:可选,表示转换…

    JavaScript 2023年5月28日
    00
  • JavaScript入门教程(6) Window窗口对象

    JavaScript入门教程(6) Window窗口对象 在网页中,Window对象(窗口对象)是最高级别的对象,代表了一个浏览器窗口或者框架。本文将详细介绍Window对象的属性和方法,并给出相应的示例说明。 窗口对象属性 1. Window.outerWidth 和 Window.outerHeight 这两个属性表示浏览器窗口的宽度和高度,包括边框和滚…

    JavaScript 2023年5月28日
    00
  • JavaScript中for循环的使用详解

    JavaScript中for循环的使用详解 在JavaScript中,循环是一种重要的编程语言结构,for循环是最常用的循环语句之一,可以用来实现对数组、对象、字符串等类型的数据进行遍历,下面我们来详细讲解一下JavaScript中for循环的使用。 基本语法 for循环的基本语法如下: for (初始化表达式; 条件表达式; 递增表达式) { // 循环体…

    JavaScript 2023年5月28日
    00
  • Linux下使用jq友好的打印JSON技巧分享

    Linux下使用jq友好的打印JSON技巧分享 什么是jq? jq是一个轻量级的命令行JSON处理工具,它具有过滤、修改和转换JSON数据的功能,并且非常灵活和强大。 安装jq 在大多数Linux发行版上,jq可以通过软件包管理器来安装,例如在Debian/Ubuntu上,可以使用以下命令: sudo apt-get install jq 如果使用的是其他发…

    JavaScript 2023年5月27日
    00
  • js实现拖拽 闭包函数详细介绍

    JavaScript实现拖拽 闭包函数详细介绍 在网页开发中,经常会遇到需要通过鼠标拖拽来实现一些操作的需求,如拖拽图片、调整界面尺寸等。下面我们以一个实现拖拽的例子来介绍如何使用JavaScript实现拖拽功能,并介绍闭包函数的概念和应用。 实现拖拽的思路 当鼠标按下时,记录下鼠标的位置和拖拽元素的位置。 当鼠标移动时,根据鼠标移动的距离来更新拖拽元素的位…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部