js匿名函数及函数封装

  • 内容
  • 相关

最近在整理javascript 学习,发现这个问题了 ,在网上发现这么个解释 最清楚 最明白 ;

(function(){})()

相当于先定义 function xx(){},后调用 xx();
()是最高优先级的,所以先执行function(){},
这个定义了一个匿名函数,等于xx=function(){}
接着就是调用xx()了;
给个例子

JScript code
functionf1(a){
    alert(a);
}
functionf2(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() { 和)(); 最外面的这两行,有什么用啊?

JScript code
YY=YY||{}; 
//---声明一个叫YY的命名空间(定义一个全局的变量)
//(function() {
    YY.Lang=function() {
    //------声明一个叫YY.Lang的命名空间(通过全局变量的增加属性的方式把闭包里的对象传到全局变量中,实现代码封装的效果) 
    isUndefined:function(o) {
        returntypeofo==='undefined'; 
    },
    isString:function(o) {
        returntypeofo==='string'; 
    } 
    }; 
}
//)();
//---调用方法
alert(YY.Lang.isString('test me'));

   
疑问在这:??????注释掉这两行有什么不一样的呢?不就是申明吗,为什么要用()()执行一下啊?
答:
(function(){})()意思是立即执行前一个括号里的function,相当于是一个匿名函数;由于里面的代码的执行,定义了YY.Lang这个对象,所以可以执行alert(YY.Lang.isString('test me'));调用isString方法。
但是,如果按照你写的  
functionaa(){..};//只是定义了一个叫aa的函数,但是并没有执行
alert(YY.Lang.isString('test me'));//执行的时候会报找不到isString的方法。 
这么写有什么好处??????????????
(function{})()的写法有个好处,就是能很好的利用javascript的变量的可见范围为执行脚本时节省空间。例如以下写法1和写法2达到的目的是一样的,但是写法1的由于a变量的可见范围只是在匿名函数体内,所以a在执行完这个匿名函数后就释放空间了。但是写法2会一直存在该页面中。
写法1:

JScript code
(function(){vara=2; alert(a); })();


写法2:

JScript code
vara=2; alert(a);

 


本文标签:

版权声明:若无特殊注明,本文皆为《司马迁》原创,转载请保留文章出处。

本文链接:js匿名函数及函数封装 - http://tv1314.com/post-275.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论

8条评论
  1. avatar

    web前端 Lv.2 Firefox 17.0 Firefox 17.0 GNU/Linux x64 GNU/Linux x64 回复

    这是通过闭包来封装吗,jQuery源码就是这样[困]
    http://www.rehack.cn/

    北京市 电信

    1. avatar

      兆杖贾59 Lv.1 Firefox 29.0 Firefox 29.0 Windows 7 Windows 7 回复

      [1]

      湖北省随州市 移动

      00:00 / 00:00
      顺序播放