脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-javascript闭包详解,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 以前写过一篇关于javascript闭包的随笔,javascript闭包,但是写的不够详细,也没有体现出闭包的强大之处。故作此篇。
众所周知,javascript没有块级作用域,只有函数作用域。那就意味着定义在函数中的参数和变量在函数外部是不可见的,而在一个函数内部任何位置定义的变量,在该函数内部任何地方都可见。这带来的好处是内部函数可以访问定义它们的外部函数的参数和变量。
首先,我们来构造一个简单的对象
复制代码
2 value: 10,
3 add: function(inc){
4 this.value += (tyPEof inc === "number") ? inc : 1;
5 }
6 };
7
8 testObj.add();
9 testObj.value; // 11
10
11 testObj.add(2);
12 testObj.value; // 13
复制代码
这样写就有一个问题,value值不能保证不会被非法修改,可以按如下的方法进行修改。
复制代码
1 var testObj = (function(){
2 var value = 10;
3 return {
4 add: function(inc){
5 value += (typeof inc === "number") ? inc : 1;
6 },
7 getValue: function(){
8 return value;
9 }
10 };
11 })();
12
13 testObj.add();
14 testObj.getValue(); // 11
15
16 testObj.add(2);
17 testObj.getValue(); // 13
复制代码
我们可以通用调用一个函数的形式去初始化testObj,该函数会返回一个对象字面量,函数里定义了一个value变量,该变量对add和getValue方法总是可用的,但函数的作用域使得它对其他的程序来说是不可见的。同时,我们还可以得出一个结论,内部函数拥有比它的外部函数更长的生命周期。
我们再继续看一个构造函数调用的例子。
复制代码
var MyObj = function(str){
this.status = str;
};
MyObj.PRototype.getStatus = function(){
return this.status;
};
var obj = new MyObj("javascript");
obj.getStatus(); // "javascript"
复制代码
这样写并没有错,但是会有一点“多此一举”,为什么要用一个getStatus方法去访问一个本可以直接访问到的属性呢?如果status是私有属性,那当然才有意义。
复制代码
var obj = function(status){
return {
getStatus: function(){
return status;
}
};
};
var myObj = obj("javascript");
myObj.getStatus(); // "javascript"
复制代码
这里当我们调用Obj的时候,它返回包含getStatus方法的一个新对象,该对象的一个引用保存在myObj中,即使obj已经返回了,但getStatus方法仍然享有访问obj对象的status属性的特权。getStatus方法并不是访问该参数的一个副本,它访问的就是该参数本身。这是可能的,因为该函数可以访问它被创建时所处的上下文环境,这被称为闭包。
觉得可用,就经常来吧! 脚本宝典 欢迎评论哦! js脚本,巧夺天工,精雕玉琢。小宝典献丑了!
以上是脚本宝典为你收集整理的javascript代码实例教程-javascript闭包详解全部内容,希望文章能够帮你解决javascript代码实例教程-javascript闭包详解所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。