lletica

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

(function(){})()

找不到原帖地址了,简单修改了下。
 
-----------------------------------------------
 
(function(){})()定义了一个匿名函数,相当于先定义 function xx(){},然后调用 xx();
()是最高优先级的,所以先执行function(){},相当于xx=function(){},接着就是调用xx()了。
 
给个例子:
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);  
 })(); 
 
另外还有一个问题 就是命名空间的问题
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'));
 
这时候就有人不明了,为什么要加(function() { 和 })(); 最外面的这两行,有什么用呢?
疑问:注释掉这两行有什么不一样的呢?不就是声明吗,为什么要用()()执行一下啊? 
答:
(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(){vara=2; alert(a); })();
写法2:
vara=2; alert(a);
posted on 2013-09-05 21:15  lletica  阅读(247)  评论(0)    收藏  举报