JavaScript中的闭包

分享于 

4分钟阅读

Web开发

  繁體 雙語

介绍

这个函数的非局部变量 是一个函数,它是一个函数,它是一个函数,它与一个引用环境一起。 <<参考链接 http://en.wikipedia.org/wiki/Closure_(programming)>>

在JavaScript中,如果我们创建函数 inside 另一个函数,我们创建一个关闭。

在大多数公共语言中,函数返回后,由于堆栈帧被破坏,所有局部变量都不能再访问。 记住,闭包可以被看作是一个堆栈框架,当函数返回时,它是不可被释放的。

为何使用闭包

我有很多问题问我为什么需要闭包。 我会试着解释。

当我们使用表格控件,我可以将页面索引 等等 与闭包存储在一起,行计数等等,我可以用它来处理其他客户函数。 使用 FSO,我可以保存文件路径,计数等以备以后使用。 它不仅针对复杂的客户端控件。 考虑页面有许多控件并且执行客户端验证的场景。 每次通过下列方式访问控件时

document.getElementById("controlname") 

搜索整个页面控件树。 这可以避免使用闭包,只需一次保存控件即可。 可用性是闭包的一个关键优点。 希望我已经相信很少能知道闭包了。

使用代码

查看函数 below:

function sayHello(name) {
 var text = 'Hello ' + name; // local variablevar sayAlert = function() { alert(text); }
 return sayAlert;
}

现在,我们按以下方式调用函数:

var say2 = sayHello("Sachin");
say2();

函数 sayHello() 返回指向函数 sayAlert()的指针。

如果在其他函数中声明函数,那么在从调用的函数返回之后,局部变量可以保持可以访问的状态。 演示 上面 ;我们从 sayHello() 返回后调用函数 say2()。 注意,我们调用的代码引用变量 text,它是函数 sayHello()的局部变量。

考虑函数 below:

function setupSomeGlobals() {
 // Local variable that ends up within closurevar num = 666;
 // Store some references to functions as global variables gAlertNumber = function() { alert(num); }
 gIncreaseNumber = function() { num++; }
 gSetNumber = function(x) { num = x; }
}

三个函数 gAlertNumber()gIncreaseNumber()gSetNumber(x) 共享对同一闭包的共享访问- 在定义了3 个函数时,setupSomeGlobals()的局部变量。

可以通过调用其他函数来检查这一点。

尝试 below 序列:

setupSomeGlobals() //value of num is 666 gAlertNumber () //alerts 666 gIncreaseNumber() 
gAlertNumber () //alerts 667 gSetNumber (600) 
gAlertNumber () //alerts 600

如果再次调用 setupSomeGlobals(),则创建一个新的闭包( 堆栈帧)。 旧的gAlertNumbergIncreaseNumbergSetNumber 变量被新的函数覆盖,这些函数具有新的闭包。

摘要

  • JavaScript的闭包就像保存所有局部变量的副本一样,就像在函数退出时一样。
  • 最好认为一个闭包始终只是在条目的条目上创建,并且局部变量被添加到该闭包中。
  • 每当一个具有闭包的函数被称为( 函数包含函数声明,然后返回一个引用,或者在某种方式下保存外部引用) 时,一组新的局部变量被保存。

相关文章