你必须知道的【闭包】陷阱和案例

来源:未知 责任编辑:责任编辑 发表时间:2014-05-26 11:00 点击:

闭包
In some languages, a closure may occur when a function is defined within another function, and the inner function refers to local variables of the outer function.
At run-time, when the outer function executes, a closure is formed, consisting of the inner function’s code and references (the upvalues) to any variables of the outer function required by the closure.
 
翻译:
在一些编程语言当中,闭包发生  :在一个函数内部定义了另外一个函数,并且内部的函数引用了外部函数的本地变量。
在运行的时候,当外部函数执行,这个时候形成了一个闭包,由内部函数的代码和对外部函数任意变量引用组成,这写引用都依赖于此闭包。
// ECMAScript
var f, g;
function foo() {
    var x = 0;
    f = function () { return ++x; };
    g = function () { return --x; };
    x = 1;
    alert('inside foo, call to f(): ' + f()); // "2"
}
//外部函数执行,这个时候形成了闭包
foo();
//因为有了闭包,所以才访问到了 foo中的x
alert('call to g(): ' + g()); // "1"
//因为有了闭包,所以才访问到了 foo中的x
alert('call to f(): ' + f()); // "2"
 
 
javascript闭包陷阱与案例
在很多时候,由于内部函数的变量覆盖了闭包的变量,我们如果需要引用外部函数同名的变量,需要通过执行匿名函数,不外部函数的变量作为参数传递进来。如下所示:
(function(out_xxx){
//这里面就可以使用out_xxx
 }(xxx))
可以看得出来,使用这种方式最多的地方是在我们定义对象的时候:
(function (window) {
    var MyObject = function () {
        this.initialize();
    }
    var p = DisplayObject.prototype;
    p.initialize = function () {
   
    }
    window.MyObject = MyObject;
} (window));
这样定义对象有两个好处:
1.避免污染外部变量
2.传递参数的形式减少作用域查找
javascript为我们埋了很多坑,在许多场景下,我们需要利用以上的形式去解决问题,下面依依列出。
 
场景1 :
如下所示,我需要在cc方法中调用到外面的name:
    var bb, cc;
    function aa() {
        var name = "当耐特";
        bb = function () {
            var name = "砖家";
            cc = function () {
                var name = "张磊";
                alert(name);
            }
        }

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Gb2312转utf-8编码的方法(vbs+js)
  • 如何使用Ajax技术开发Web应用程序(1)
  • js跳转路径问题
  • JavaScript模仿桌面窗口
  • 用js检测两个线段是否相交
  • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
  • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
  • 我是如何去了解jquery的(六),案例之幻灯片轮换
  • Jquery封装幻灯片效果
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1