用最通俗易懂的代码帮助新手理解javascript闭包(2)

N突破了F的限制!跑到于a同一层了!因为函数只认它们在定义时所处的环境而不是执行时,这点很重要),N中的c仍然可以访问b!此时的a还是不可以访问b!

但是这是怎么实现的呢?如下:
闭包1:

复制代码 代码如下:


function f(){
var b = "b";
return function(){ //没有名字的函数,所以是匿名函数
return b;
}
}


注意返回的函数可以访问它父亲函数中的变量b
此时如果你想取b的值,当然是undefined
但是如果你这么做:

复制代码 代码如下:


var n = f();
n();


你可以取到b的值了!虽然此时n函数在f的外面,b又属于f内部的变量,但是f内部出了一个内鬼,返回了b的值……
现在大家有点感觉了吧
闭包2:

复制代码 代码如下:


var n;
function f(){
var b = "b";
n = function(){
return b;
}
}


如果此时调用f会怎么样?那就生成了一个n的全局范围函数,但是它却能访问f的内部,照样返回b的值,与上面有异曲同工之妙!
闭包3:
你还可以用闭包访问函数的参数

复制代码 代码如下:


function f(arg) {
var n = function(){
return arg;
};
arg++;
return n;
}


此时如果使用:

复制代码 代码如下:


var m = f(123);
m();


结果是124
因为此时f中返回的匿名函数经过了两道转手,先给n,再赋给外面的m,但本质没有变,把定义时父函数的参数返回了
闭包4:

复制代码 代码如下:


var getValue, setValue;
function() {
var secret = 0;
getValue = function(){
return secret;
};
setValue = function(v){
secret = v;
};
})


运行:

复制代码 代码如下:


getValue()
0
setValue(123)
getValue()
123


这个就不用解释了吧,如果你有面向对象语言基础的话(如C#),这里的getValue和setValue就类似于一个对象的属性访问器,你可以通过这两个访问器来赋值和取值,而不是能访问其中内容
其实书中还有几个闭包的例子,但是原理用上面四个就足够了,希望能起抛砖引玉的作用,给javascript进阶者对闭包有一个更深刻的理解

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdjgyd.html