最近在看一些javascript的代码 不知道(function{})()这种写法什么一个意思,应该是跟闭包有关系。但是就是搞不清楚里面定义的 一些对象和属性是如何的一个应用范围,什么时候被创建等,各位大虾指教一下吧~~感谢~
以ext为例有这么一段:
(function() {
        Ext.lib.Scroll = function(el, attributes, duration, method) {
            if (el) {
                Ext.lib.Scroll.superclass.constructor.call(this, el, attributes, duration, method);
            }
        };        Ext.extend(Ext.lib.Scroll, Ext.lib.ColorAnim);
        var Y = Ext.lib;
        var superclass = Y.Scroll.superclass;
        var proto = Y.Scroll.prototype;        proto.toString = function() {
            var el = this.getEl();
            var id = el.id || el.tagName;
            return ("Scroll " + id);
        };        proto.doMethod = function(attr, start, end) {
            var val = null;            if (attr == 'scroll') {
                val = [
                        this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames),
                        this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames)
                        ];            } else {
                val = superclass.doMethod.call(this, attr, start, end);
            }
            return val;
        };        proto.getAttribute = function(attr) {
            var val = null;
            var el = this.getEl();            if (attr == 'scroll') {
                val = [ el.scrollLeft, el.scrollTop ];
            } else {
                val = superclass.getAttribute.call(this, attr);
            }            return val;
        };        proto.setAttribute = function(attr, val, unit) {
            var el = this.getEl();            if (attr == 'scroll') {
                el.scrollLeft = val[0];
                el.scrollTop = val[1];
            } else {
                superclass.setAttribute.call(this, attr, val, unit);
            }
        };
    })()

解决方案 »

  1.   

    (function(){})()
    相当于先定义 function xx(){},后调用 xx();
    ()是最高优先级的,所以先执行function(){},
    这个定义了一个匿名函数,等于xx=function(){}
    接着就是调用xx()了;如果函数定义是用到了变量,在执行的时候可能不存在的话,可通过此方法先将变量作为参数出入,
    在定义时先将值固定下来。
    for(var i=0;i<x;i++) xxx.onclick=(function(n){ return function(){alert(n)}; })(i);
      

  2.   

    给个例子function f1(a){
      alert(a);
    }function f2(a){
      return function(){
        alert(a); 
     }
    }
    这里的var x=f2 就等于把函数传递给了f2,然后要执行这个函数,就必须加() 也就是x();
    也就是f2() 
    还是(function f2(a){
      return function(){
        alert(a); 
     })()不知这样是否清楚点
      

  3.   

    感谢各位的帮助。其实还有一个问题就是命名空间的问题。今天请教同事,基本上搞清楚了,以下是我的理解。
    例如:
    YY = YY||{};---声明一个叫YY的命名空间(定义一个全局的变量)
    (function() {
    YY.Lang=function() {------声明一个叫YY.Lang的命名空间(通过全局变量的增加属性的方式把闭包里的对象传到全局变量中,实现代码封装的效果)
    isUndefined: function(o) {
            return typeof o === 'undefined';
        },
    isString: function(o) {
            return typeof o === 'string';
        }
    };})();---调用方法
    alert(YY.Lang.isString('test me'));不知道这么理解有没有错,各位大虾再指点一下呗?
      

  4.   

    我还是不明白,楼上为什么要加(function() { 和)(); 最外面的这两行,有什么用啊?YY = YY||{};---声明一个叫YY的命名空间(定义一个全局的变量)
    //(
    function() 
    {
    YY.Lang=function() {------声明一个叫YY.Lang的命名空间(通过全局变量的增加属性的方式把闭包里的对象传到全局变量中,实现代码封装的效果)
    isUndefined: function(o) {
            return typeof o === 'undefined';
        },
    isString: function(o) {
            return typeof o === 'string';
        }
    };}//)();---调用方法
    alert(YY.Lang.isString('test me')); 
    注释掉这两行有什么不一样的呢?不就是申明吗,为什么要用()()执行一下啊?
      

  5.   

    (function(){})()意思是立即执行前一个括号里的function,相当于是一个匿名函数;由于里面的代码的执行,定义了YY.Lang这个对象,所以可以执行alert(YY.Lang.isString('test me'));调用isString方法。
    但是,如果按照你写的function aa(){..};//只是定义了一个叫aa的函数,但是并没有执行
    alert(YY.Lang.isString('test me')); //执行的时候会报找不到isString的方法。
    另外补充一个说明,刚请教同事。
    (function{})()的写法有个好处,就是能很好的利用javascript的变量的可见范围为执行脚本时节省空间。例如以下写法1和写法2达到的目的是一样的,但是写法1的由于a变量的可见范围只是在匿名函数体内,所以a在执行完这个匿名函数后就释放空间了。但是写法2会一直存在该页面中。
    写法1:(function(){
    var a = 2;
    alert(a);
    })();写法2:
    var a = 2;
    alert(a);不知道还有什么补充没?有交流才有进步,呵呵~
      

  6.   

    楼主的最后的理解是对的,可以参考javaScript权威指南一书,里面有答案与示例。
      

  7.   

    今天我在用jquery和Ajax完成分页功能时候,遇到了个问题---在for循环体内为每个链接添加单击事件,结果后边的事件覆盖了前边的事件,后来经过上网查看,解决了这个问题,方法也就是上面各位所讨论的知识点,真是很感激呀