欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > 前端技术 > javascript >内容正文

javascript

讲讲javascript的闭包 -凯发ag旗舰厅登录网址下载

发布时间:2025/1/21 javascript 17 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 讲讲javascript的闭包 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

简介

函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起构成闭包closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在 javascript 中,每当函数被创建,就会在函数生成时生成闭包。

简单的来讲,闭包就是一个函数里面嵌套一个函数。

function a (){var text = "func";function b(){console.log(text); };b(); } a(); // 输出 func

可见,嵌套函数可访问声明于它们外部作用域的变量。这也是闭包的作用之一。

实例

function makefunc() {var name = "tom";function displayname() {alert(name);}return displayname; }var myfunc = makefunc(); myfunc();

第一眼看上去,也许不能直观地看出这段代码能够正常运行。在一些编程语言中,一个函数中的局部变量仅存在于此函数的执行期间。一旦 makefunc() 执行完毕,你可能会认为 name 变量将不能再被访问。然而,因为代码仍按预期运行,所以在 javascript 中情况显然与此不同。

原因在于,javascript中的函数会形成了闭包。 闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量。在本例子中,myfunc 是执行 makefunc 时创建的 displayname 函数实例的引用。displayname 的实例维持了一个对它的词法环境(变量 name 存在于其中)的引用。因此,当 myfunc 被调用时,变量 name 仍然可用,其值 tom就被传递到alert中。

用闭包模拟私有方法

在许多编程语言中是支持私有方法的,比如java。

我们在js里面可以用闭包模拟私有方法。

其实在日常javascript的使用中,我们天天在用闭包的私有方法。

比如说:

var num = number.parseint(3.14) console.log(num); // 3

其中的number.parseint()

就是用的闭包模拟的私有方法。

使用私有方法的好处

  • 私有方法不仅仅有利于限制对代码的访问
  • 还提供了管理全局命名空间的强大能力
  • 避免非核心的方法弄乱了代码的公共接口部分。

实例

var makecounter = function() {var privatecounter = 0;// 函数功能: 改变privatecounter的值function changeby(val) {privatecounter = val;}return {increment: function() {changeby(1);},decrement: function() {changeby(-1);},value: function() {return privatecounter;}} };var counter1 = makecounter(); var counter2 = makecounter(); console.log(counter1.value()); /* logs 0 */ counter1.increment(); counter1.increment(); console.log(counter1.value()); /* logs 2 */ counter1.decrement(); console.log(counter1.value()); /* logs 1 */ console.log(counter2.value()); /* logs 0 */

请注意两个计数器 counter1 和 counter2 是如何维护它们各自的独立性的。每个闭包都是引用自己词法作用域内的变量 privatecounter 。

每次调用其中一个计数器时,通过改变这个变量的值,会改变这个闭包的词法环境。然而在一个闭包内对变量的修改,不会影响到另外一个闭包中的变量。

总结

以上是凯发ag旗舰厅登录网址下载为你收集整理的讲讲javascript的闭包的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。

网站地图