广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何理解并掌握JavaScript闭包
  • 483
分享到

如何理解并掌握JavaScript闭包

2024-04-02 19:04:59 483人浏览 泡泡鱼
摘要

这篇文章主要介绍“如何理解并掌握javascript闭包”,在日常操作中,相信很多人在如何理解并掌握JavaScript闭包问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何

这篇文章主要介绍“如何理解并掌握javascript闭包”,在日常操作中,相信很多人在如何理解并掌握JavaScript闭包问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解并掌握JavaScript闭包”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Ali的回答:

当function里嵌套function时,内部的function可以访问外部function里的变量。

function foo(x) {    var tmp = 3;    function bar(y) {      alert(x + y + (++tmp));    }    bar(10);  }  foo(2)

不管执行多少次,都会alert 16,因为bar能访问foo的参数x,也能访问foo的变量tmp。

但,这还不是闭包。当你return的是内部function时,就是一个闭包。内部function会close-over外部function的变量直到内部function结束。

function foo(x) {    var tmp = 3;    return function (y) {      alert(x + y + (++tmp));    }  }  var bar = foo(2); // bar 现在是一个闭包  bar(10);

上面的脚本最终也会alert 16,因为虽然bar不直接处于foo的内部作用域,但bar还是能访问x和tmp。

但是,由于tmp仍存在与bar闭包的内部,所以它还是会自加1,而且你每次调用bar时它都会自加1.

(考虑到六岁这个限制:我们其实可以建立不止一个闭包方法,比如return它们的数组,也可以把它们设置为全局变量。它们全都指向相同的x和相同的tmp,而不是各自有一份副本。)

注:现在来整点儿七岁的内容。

上面的x是一个字面值(值传递),和js里其他的字面值一样,当调用foo时,实参x的值被复制了一份,复制的那一份作为了foo的参数x。

那么问题来了,JS里处理object时是用到引用传递的,那么,你调用foo时传递一个object,foo函数return的闭包也会引用最初那个object!

function foo(x) {    var tmp = 3;    return function (y) {      alert(x + y + tmp);      x.memb = x.memb ? x.memb + 1 : 1;      alert(x.memb);    }  }  var age = new Number(2);  var bar = foo(age); // bar 现在是一个引用了age的闭包  bar(10);

不出我们意料,每次运行bar(10),x.memb都会自加1。但需要注意的是x每次都指向同一个object变量——age,运行两次bar(10)后,age.memb会变成2.

这和html对象的内存泄漏有关,呃,不过貌似超出了答题的范围。

JohnMerlino 对Ali说:

这里有一个不用return关键字的闭包例子:

function closureExample(obj, text, timedelay) {       setTimeout(function() {           document.getElementById(objID).innerHTML = text;           }, timedelay);   }   closureExample(‘myDiv’, ‘Closure is created’, 500);

深夜1:37 John Pick这样回答:

JS里的function能访问它们的:

1. 参数

2. 局部变量或函数

3. 外部变量(环境变量?),包括

3.1 全局变量,包括DOM

3.2 外部函数的变量或函数。

如果一个函数访问了它的外部变量,那么它就是一个闭包。

注意,外部函数不是必需的。通过访问外部变量,一个闭包可以维持(keep alive)这些变量。在内部函数和外部函数的例子中,外部函数可以创建局部变量,并且最终退出;但是,如果任何一个或多个内部函数在它退出后却没有退出,那么内部函数就维持了外部函数的局部数据。

一个典型的例子就是全局变量的使用。

mykhal这样回答:

Wikipedia对闭包的定义是这样的:

In computer science, a closure is a function together with a referencing environment for the nonlocal names (free variables) of that function.

从技术上来讲,在JS中,每个function都是闭包,因为它总是能访问在它外部定义的数据。

Since scope-defining construction in Javascript is a function, not a code block like in many other languages, what we usually mean by closure in Javascript is a fuction working with nonlocal variables defined in already executed surrounding function.

闭包经常用于创建含有隐藏数据的函数(但并不总是这样)。

var db = (function() {    // 创建一个隐藏的object, 这个object持有一些数据    // 从外部是不能访问这个object的    var data = {};    // 创建一个函数, 这个函数提供一些访问data的数据的方法    return function(key, val) {      if (val === undefined) { return data[key] } // get      else { return data[key] = val } // set    }    // 我们可以调用这个匿名方法    // 返回这个内部函数,它是一个闭包  })();  db('x');    // 返回 undefined  db('x', 1); // 设置data['x']为1  db('x');    // 返回 1  // 我们不可能访问data这个object本身  // 但是我们可以设置它的成员

到此,关于“如何理解并掌握JavaScript闭包”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何理解并掌握JavaScript闭包

本文链接: https://www.lsjlt.com/news/86849.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解并掌握JavaScript闭包
    这篇文章主要介绍“如何理解并掌握JavaScript闭包”,在日常操作中,相信很多人在如何理解并掌握JavaScript闭包问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何...
    99+
    2022-10-19
  • 如何理解并掌握HashMap
    这篇文章主要介绍“如何理解并掌握HashMap”,在日常操作中,相信很多人在如何理解并掌握HashMap问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解并掌握HashMap”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-16
  • 怎么理解并掌握Rust包管理器Cargo
    本篇内容主要讲解“怎么理解并掌握Rust包管理器Cargo”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解并掌握Rust包管理器Cargo”吧!Rust 是一种现代编程语言,可提供高性能、...
    99+
    2023-06-16
  • 怎么理解并掌握JavaScript中的this
    这篇文章主要介绍“怎么理解并掌握JavaScript中的this”,在日常操作中,相信很多人在怎么理解并掌握JavaScript中的this问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2022-10-19
  • JavaScript闭包如何理解
    这篇“JavaScript闭包如何理解”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav...
    99+
    2022-10-19
  • 怎么理解并掌握JavaScript中的this关键字
    这篇文章主要讲解了“怎么理解并掌握JavaScript中的this关键字”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解并掌握JavaScript中的...
    99+
    2022-10-19
  • 如何理解并掌握ES6中的迭代器
    这篇文章主要介绍“如何理解并掌握ES6中的迭代器”,在日常操作中,相信很多人在如何理解并掌握ES6中的迭代器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解并掌握ES6...
    99+
    2022-10-19
  • 怎么理解并掌握JavaScript中变量和作用域
    这篇文章主要讲解了“怎么理解并掌握JavaScript中变量和作用域”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解并掌握JavaScript中变量和作用域”吧!JavaScript的...
    99+
    2023-06-02
  • 如何理解及使用Python闭包
    目录一、Python 中的作用域规则和嵌套函数二、定义闭包函数三、何时使用闭包? 四、总结一、Python 中的作用域规则和嵌套函数 每当执行一个函数时,就会创建一个新的局部命名空间...
    99+
    2022-11-12
  • 如何理解Python中的闭包Closure
    如何理解Python中的闭包Closure,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都...
    99+
    2023-06-17
  • 详解JavaScript中的闭包是如何产生的
    目录闭包的产生多个内部函数共享一个闭包对象结尾这次从内存管理的角度来看看,闭包是怎么产生的。 我们知道,在调用函数时,其实会产生临时的 调用栈。这些调用栈保存的是 执行上下本,并实际...
    99+
    2022-12-28
    JavaScript闭包如何产生 JavaScript闭包
  • 如何理解Rust闭包的虫洞穿梭
    这篇文章主要介绍“如何理解Rust闭包的虫洞穿梭”,在日常操作中,相信很多人在如何理解Rust闭包的虫洞穿梭问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Rust闭包...
    99+
    2022-10-19
  • 如何用Python和JavaScript处理大数据?这些技巧你必须掌握!
    大数据处理已经成为现代社会的核心需求之一。在这个时代,我们需要处理的数据量越来越大,而且这些数据需要在实时的情况下进行处理。因此,掌握大数据处理技术已经成为了一项必不可少的技能。本文将介绍如何使用Python和JavaScript处理大数...
    99+
    2023-06-14
    javascript path 大数据
  • 掌握 Python 并发编程:如何使用接口和缓存实现高效数据处理?
    Python 并发编程是一个非常热门的话题,因为它可以提高程序的效率和性能。在本文中,我们将介绍如何使用接口和缓存实现高效数据处理。我们将通过演示代码来帮助您更好地理解这些概念。 什么是并发编程? 并发编程是指同时执行多个任务的能力。在计算...
    99+
    2023-06-30
    并发 接口 缓存
  • 如何在JavaScript面试中展示对Go语言并发的理解?
    在现代的软件开发领域,面试已经成为了招聘流程中不可或缺的一部分。在JavaScript面试中,对Go语言并发的理解是一项重要的技能,而如何在面试中展示这种理解则是一项挑战。在本文中,我们将介绍如何在JavaScript面试中展示对Go语言并...
    99+
    2023-06-23
    并发 javascript 面试
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作