JavaScript闭包原理与用法学习笔记闭包原理与用法学习笔记
本文实例讲述了JavaScript闭包原理与用法。分享给大家供大家参考,具体如下:
闭包闭包(Closure)
闭包是一个函数和词法环境的组合,函数声明在这个词法环境中。
词法作用域:
看下面的一个例子:
function init() {
var name = 'GaoPian';
// name是局部变量
function displayName() {
//displayName();是内部函数,一个闭包
alert(name); // 使用外部函数声明的变量
}
displayName();
}
init();
init()创建了一个局部变量name和一个函数displayName()。
函数displayName()是一个已经定义在init()内部的函数,并且只能在函数init()里面才能访问得到。
函数displayName()没有自己的局部变量,但由于内部函数可以访问外部函数变量,displayName()可以访问到声明在外部函数
init()的变量name,如果局部变量还存在的话,displayName()也可以访问他们。
闭包
看下面一个例子
function makeFunc() {
debugger
var name = 'GaoPian';
function displayName() {
alert(name);
}
return displayName;
}
var myFunc = makeFunc();
myFunc();
运行这段代码和之前init()的方法的效果是一样。
经过debugger一遍之后发现:
二者不同之处是,displayName()在执行之前,这个内部方法是从外部方法返回来的。
首先,代码还是会正确运行,在一些编程语言当中,一个函数内的局部变量只存在于该函数的执行期间,随后会被销毁,一旦
makeFunc()函数执行完毕的话,变量名就不能够被获取,但是,由于代码仍然正常执行,这显然在JS里是不会这样的。这是
因为函数在JS里是以闭包的形式出现的。
闭包是一个函数和词法作环境的组合,词法环境是函数被声明的那个作用域,这个执行环境包括了创建闭包时同一创建的任意闭包是一个函数和词法作环境的组合,词法环境是函数被声明的那个作用域,这个执行环境包括了创建闭包时同一创建的任意
变量,即创建的这个函数和这些变量处于同一个作用域当中。在这个例子当中,变量,即创建的这个函数和这些变量处于同一个作用域当中。在这个例子当中,myFunc()是是displayName()的函数实的函数实
例,例,makeFunc创建的时候,创建的时候,displayName随之也创建了。随之也创建了。displayName的实例可以获得词法作用域的引用,在这个词法作的实例可以获得词法作用域的引用,在这个词法作
用域当中,存在变量用域当中,存在变量name,对于这一点,当,对于这一点,当myFunc调用的话,变量调用的话,变量name,仍然可以被调用,因此,变量,仍然可以被调用,因此,变量’GaoPian’传递给传递给
了了alert函数。函数。
这里还有一个例子
function makeAdder(x) {
return function (y) {
return x + y;
}