返回顶部
首页 > 资讯 > 精选 >javascript中闭包closure的代码案例
  • 337
分享到

javascript中闭包closure的代码案例

2023-06-06 17:06:52 337人浏览 安东尼
摘要

这篇文章主要讲解了“javascript中闭包closure的代码案例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript中闭包closure的代码案例”吧!简介闭包closu

这篇文章主要讲解了“javascript中闭包closure的代码案例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript中闭包closure的代码案例”吧!

简介

闭包closure是javascript中一个非常强大的功能。所谓闭包就是函数中的函数,内部函数可以访问外部函数的作用域范围,从而可以使用闭包来做一些比较强大的工作。

今天将会给大家详细介绍一下闭包。

函数中的函数

我们提到了函数中的函数可以访问父函数作用域范围的变量,我们看一个例子:

function parentFunction() { var address = 'flydean.com';  function alertAddress() {  alert(address);  } alertAddress();}parentFunction();

上面的例子中,我们在parentFunction中定义了一个变量address,在parentFunction内部定义了一个alertAddress方法,在该方法内部访问外部函数中定义的address变量。

上面代码运行是没问题的,可以正确的访问到数据。

Closure闭包

函数中的函数有了,那么什么是闭包呢?

我们看下面的例子:

function parentFunction() { var address = 'flydean.com';  function alertAddress() {  alert(address);  } return alertAddress;}var myFunc = parentFunction();myFunc();

这个例子和第一个例子很类似,不同之处就是我们将内部函数返回了,并且赋值给了myFunc。

接下来我们直接调用了myFunc。

myFunc中访问了parentFunction中的address变量,虽然parentFunction已经执行完毕返回。

但是我们在调用myFunc的时候,任然可以访问到address变量。这就是闭包。

闭包的这个特性非常拥有,我们可以使用闭包来生成function factory,如下所示:

function makeAdder(x) { return function(y) { return x + y; };}var add5 = makeAdder(5);var add10 = makeAdder(10);console.log(add5(2)); // 7console.log(add10(2)); // 12

其中add5和add10都是闭包,他们是由makeAdder这个function factory创建出来的。通过传递不同的x参数,我们得到了不同的基数的add方法。

最终生成了两个不同的add方法。

使用function factory的概念,我们可以考虑一个闭包的实际应用,比如我们在页面上有三个button,通过点击这些button可实现修改字体的功能。

我们可以先通过function factory来生成三个方法:

function makeSizer(size) { return function() { document.body.style.fontSize = size + 'px'; };}var size12 = makeSizer(12);var size14 = makeSizer(14);var size16 = makeSizer(16);

有了这三个方法,我们把DOM元素和callback方法绑定起来:

document.getElementById('size-12').onclick = size12;document.getElementById('size-14').onclick = size14;document.getElementById('size-16').onclick = size16;

使用闭包实现private方法

对比java来说,java中有private访问描述符,通过private,我们可以指定方法只在class内部访问。

当然,在js中并没有这个东西,但是我们可以使用闭包来达到同样的效果。

var counter = (function() { var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() {  changeBy(1); }, decrement: function() {  changeBy(-1); }, value: function() {  return privateCounter; } };})();console.log(counter.value()); // 0.counter.increment();counter.increment();console.log(counter.value()); // 2.counter.decrement();console.log(counter.value()); // 1.

我们在父function中定义了privateCounter属性和changeBy方法,但是这些方法只能够在内部function中访问。

我们通过闭包的概念,将这些属性和方法封装起来,暴露给外部使用,最终达到了私有变量和方法封装的效果。

闭包的Scope Chain

对于每个闭包来说,都有一个作用域范围,包括函数本身的作用域,父函数的作用域和全局的作用域。

如果我们在函数内部嵌入了新的函数,那么就会形成一个作用域链,我们叫做scope chain。

看下面的一个例子:

// global scopevar e = 10;function sum(a){ return function(b){ return function(c){  // outer functions scope  return function(d){  // local scope  return a + b + c + d + e;  } } }}console.log(sum(1)(2)(3)(4)); // log 20

闭包常见的问题

第一个常见的问题就是在循环遍历中使用闭包,我们看一个例子:

function showHelp(help) { document.getElementById('help').innerhtml = help;}function setupHelp() { var helpText = [  {'id': 'email', 'help': 'Your e-mail address'},  {'id': 'name', 'help': 'Your full name'},  {'id': 'age', 'help': 'Your age (you must be over 16)'} ]; for (var i = 0; i < helpText.length; i++) { var item = helpText[i]; document.getElementById(item.id).onfocus = function() {  showHelp(item.help); } }}setupHelp();

上面的例子中,我们创建了一个setupHelp函数,setupHelp中,onfocus方法被赋予了一个闭包,所以闭包中的item可以访问到外部function中定义的item变量。

因为在循环里面赋值,所以我们实际上创建了3个闭包,但是这3个闭包共享的是同一个外部函数的作用域范围。

我们的本意是,不同的id触发不同的help消息。但是如果我们真正执行就会发现,不管是哪一个id,最终的消息都是最后一个。

因为onfocus是在闭包创建完毕之后才会触发,这个时候item的值实际上是变化的,在循环结束之后,item的值已经指向了最后一个元素,所以全部显示的是最后一条数据的help消息。

怎么解决这个问题呢?

最简单的办法使用es6中引入的let描述符,从而将item定义为block的作用域范围,每次循环都会创建一个新的item,从而保持闭包中的item的值不变。

 for (let i = 0; i < helpText.length; i++) { let item = helpText[i]; document.getElementById(item.id).onfocus = function() {  showHelp(item.help); } }

还有一种方法,就是再创建一个闭包:

function makeHelpCallback(help) { return function() { showHelp(help); };} for (var i = 0; i < helpText.length; i++) { var item = helpText[i]; document.getElementById(item.id).onfocus = makeHelpCallback(item.help); }

这里用到了之前我们提到的function factory的概念,我们为不同的闭包创建了不同的作用域环境。

还有一种方法就是将item包含在一个新的function作用域范围之内,从而每次创建都是新的item,这个和let的原理是相似的:

 for (var i = 0; i < helpText.length; i++) {  (function() {    var item = helpText[i];    document.getElementById(item.id).onfocus = function() {     showHelp(item.help);    }  })();  }

第二个常见的问题就是内存泄露。

 function parentFunction(paramA) { var a = paramA; function childFunction() { return a + 2; } return childFunction(); }

上面的例子中,childFunction引用了parentFunction的变量a。只要childFunction还在被使用,a就无法被释放,从而导致parentFunction无法被垃圾回收。

闭包性能的问题

我们定义了一个对象,并且通过闭包来访问其私有属性:

function MyObject(name, message) { this.name = name.toString(); this.message = message.toString(); this.getName = function() {  return this.name; }; this.getMessage = function() {  return this.message; };}

上面的对象会有什么问题呢?

上面对象的问题就在于,对于每一个new出来的对象,getName和getMessage方法都会被复制一份,一方面是内容的冗余,另一方面是性能的影响。

通常来说,我们将对象的方法定义在prototype上面:

function MyObject(name, message) { this.name = name.toString(); this.message = message.toString();}MyObject.prototype.getName = function() { return this.name;};MyObject.prototype.getMessage = function() { return this.message;};

注意,我们不要直接重写整个prototype,这样会导致未知的错误,我们只需要根据需要重写特定的方法即可。

总结

闭包是JS中非常强大和有用的概念,希望大家能够喜欢。

感谢各位的阅读,以上就是“javascript中闭包closure的代码案例”的内容了,经过本文的学习后,相信大家对javascript中闭包closure的代码案例这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: javascript中闭包closure的代码案例

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

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

猜你喜欢
  • javascript中闭包closure的代码案例
    这篇文章主要讲解了“javascript中闭包closure的代码案例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript中闭包closure的代码案例”吧!简介闭包closu...
    99+
    2023-06-06
  • JavaScript中的闭包closure怎么使用
    这篇文章主要介绍“JavaScript中的闭包closure怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的闭包closure怎么使用”文章能帮助大家解决问题。闭包简述...
    99+
    2023-07-02
  • JavaScript闭包实例代码分析
    这篇文章主要介绍了JavaScript闭包实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript闭包实例代码分析文章都会有所收获,下面我们一起来看看吧。什么是闭包?闭包的概念是有很多版本...
    99+
    2023-07-05
  • 学习JavaScript中的闭包closure应该注意什么
    目录闭包简述1.闭包使得内部函数可以访问外部函数的属性(变量或方法)2.闭包的广阔应用场景3.用闭包模拟私有方法4.从性能角度考虑,非必要不使用闭包闭包简述 Mozilla 上这样解...
    99+
    2024-04-02
  • 如何理解Python中的闭包Closure
    如何理解Python中的闭包Closure,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python中的闭包不是一个一说就能明白的概念,但是随着你往学习的深入,无论如何你都...
    99+
    2023-06-17
  • JavaScript中的闭包
    一.什么是闭包 1.闭包的定义 闭包并不是JS特有的,因此可以从两个角度定义闭包。 1)计算机科学中 闭包又称为词法闭包(在进行词法分析的时候这个闭包就确定了),或者是函数闭包。是在支持头等函数的编程语言中(意思是函数作为一等公民的编程语言...
    99+
    2023-08-18
    javascript 前端 java
  • JavaScript 评测代码运行速度的案例代码
    目录JavaScript 评测代码运行速度一、使用 performance.now() API二、使用 console.time() 和 console.timeEnd()三、使用第...
    99+
    2023-02-10
    js 测试代码运行速度 js测试代码
  • JavaScript闭包的示例分析
    小编给大家分享一下JavaScript闭包的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!闭包是JavaScript中的...
    99+
    2024-04-02
  • Javascript中return与闭包的示例分析
    这篇文章给大家分享的是有关Javascript中return与闭包的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、return的使用案例一:var a=1;...
    99+
    2024-04-02
  • JavaScript中闭包的使用
    本篇内容介绍了“JavaScript中闭包的使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过深入了解...
    99+
    2024-04-02
  • javascript关闭窗口的代码
    在JavaScript中关闭窗口的代码非常简单,只需调用window对象的close()方法即可。以下是关闭窗口的基本语法:window.close();当用户点击一个按钮或执行某些特定操作时,可以将该代码插入到JavaScript函数中。...
    99+
    2023-05-20
  • Javascript中递归函数的案例与代码是怎样的
    这篇文章给大家介绍Javascript中递归函数的案例与代码是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 一.递归函数的理解1、生活中的递归“递归”在生活中的一个典...
    99+
    2024-04-02
  • 闭包在Golang代码重用中的作用
    闭包是 golang 中一种允许函数访问其创建函数之外数据的特性。通过将匿名函数嵌入到另一个函数中,我们可以创建闭包。闭包在代码重用方面非常有用,因为它允许我们创建函数,这些函数可以生成...
    99+
    2024-04-16
    闭包 代码重用 golang
  • Python 中闭包与装饰器案例详解
    目录1.Python中一切皆对象2.函数式第一类对象3.函数对象 vs 函数调用4.闭包&LEGB法则5.装饰器&语法糖(syntax sugar)6. 回归问题项目...
    99+
    2024-04-02
  • javascript中变量提升和闭包的示例分析
    这篇文章主要介绍了javascript中变量提升和闭包的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们先来看一个题目:<s...
    99+
    2024-04-02
  • JavaScript中的闭包是怎样的
    这篇文章给大家介绍JavaScript中的闭包是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 闭包的概念来看一般函数的执行和启发:function stop() {  ...
    99+
    2023-06-22
  • 闭包的谜题:剖析 JavaScript 闭包中的常见问题
    闭包通过在内部函数中引用外部变量来捕获变量。当外部函数返回时,内部函数仍然可以访问这些外部变量,即使外部函数本身已被销毁。 问题 2:闭包的陷阱是什么? 内存泄漏:如果闭包持有对外部变量的引用,而外部变量又引用了一些大型对象,则即使外部函...
    99+
    2024-03-14
    闭包
  • Javascript中的闭包有什么用
    这篇文章给大家介绍Javascript中的闭包有什么用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。var array = []; array.lengt...
    99+
    2024-04-02
  • javascript中什么指的是闭包
    这篇文章主要为大家展示了“javascript中什么指的是闭包”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中什么指的是闭包”这篇文章吧。 ...
    99+
    2024-04-02
  • JavaScript中闭包的简单应用
    这篇文章主要讲解了“JavaScript中闭包的简单应用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中闭包的简单应用”吧!闭包定义在J...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作