js闭包谁能给我讲讲?

2025-04-02 18:43:09
推荐回答(1个)
回答1:

作用一:创建一个独立的名称空间。通俗易懂的理解,变量,函数的命名不容易跟其他包冲突。

var myfun = function() {
    alert("I am global myfun");
}

var bb = "bibi";

var newHello = function(){
    var myFun = function() {
        alert("I am in a closured package.");
    }
    
    var bb = "cici";
    
    return {
        bb:bb,
        myfun:myfun
    }
}();

myfun();
alert(bb);

alert(newHello.bb);

newHello.myFun();

能体会出来吗?

作用二:做面向对象编程时,可以更好的隐藏私有实现,有利于代码维护,因为javascript中的代码,基本是靠约定私有实现或私有变量的,闭包就不一样。

var newHello1 = {
    _bb:"bibi",
    _myFun:function(content){
        alert(content);
    },
    myFun:function() {
        this._myFun(
            "I am just to supply outer interface,"+
            "for your printing service"+this._bb
        );
    }
}

对象中的_开头的成员代表私有,私有的概念意思是:实现者可能会改变它,但是对外接口
一般是不会改变的。想设计框架或试用框架的时候,
你要随意改动公用接口别人怎么用这框架。强悍的dojo框架就有这毛病。
这块知识,做前端开发的很多人不知道吧?
厉害的前端开发除外,如腾讯、淘宝、百度的前端开发,别人有这能力。
因此工资一般比咋们高。

闲话少扯,上面的对象定义有个问题,使用者。
不一定会按照设计者或叫提供者的意图使用该对象。
newHello1._bb = "I always want to modify your data,"+
"how can you do what to prevent from me?";
newHello1.myFun();
上面的调用系列,就会破坏对象的封装性原则,结果可能就是库设计者不想要的,
为了防止出现上面的误用。

var newHello2 = function(){
    //这个变量别人不修改源码肯定该表不了
    var _bb = "How can you modify me?";
    var _myFun = function(content){
        alert(content);
    }
    
    return {
        myFun:function(){
            _myFun(_bb+":This takes enhancement for data privity.");
        }
    }

}();

newHello2.myFun();
上面代码只能这样调用,可以保证你不想让人动的,肯定动不了。除非修改源码。
能更好的实现设计意图。