手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:司徒正美

司徒正美:自动执行函数

司徒正美,不用多介绍了吧?博客园上,JS牛人。就象他说的,取名叫ruby并不一定就是玩ruby的(额,好象没记错)

上原文吧,因为我对JS的了解还处于较初级的阶段,所以关注的就比较多了,原文来自:http://www.cnblogs.com/rubylouvre/archive/2010/02/11/1667364.html,原文有JS的执行功能,可以尝试。

请看以下两个函数:

JavaScript代码
  1. function a(){  
  2.     alert("a")  
  3. }  
  4. var b = function(){  
  5.     alert("b")  
  6. }  
它们俩有何不同呢?翻开书,作者会告诉我们,前者为函数声明,后者为函数表达式。函数声明作为一种声明,当然会在预编译阶级有所动作(声明提前),而函数 表达式则不会。另一个区别是,函数声明不能直接加一对括号让它们执行。第三个区别,表达式还可以继续细分,表达式是由常量,变量,操作符,函数等组合而 成,计算以后返回一个结果值,至少也会返回一个undefined。
JavaScript代码
  1. function a (){  
  2.   alert("a")  
  3. }();//报错  
  4. var b = function(){  
  5.   alert("b")  
  6. }();  
  7.   
  8. (function foo(){}); // 表达式:注意它被包含在分组操作符中  
  9.  var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分  
  10.  new function bar(){}; // 表达式,因为它是New表达式的一部分  

给 function 外套一对括号(分组操作符)就不报错了,括号是表达式,是表达式就有返回值,所以可以在后面加一对括号让它们执行,再看

JavaScript代码
  1. (function  a (){  
  2.   alert("a")  
  3. })();//没有问题  

另外,我们知道,函数名的作用就是用来引用的,现在没用了,我们是不是可以把它去掉呢?

JavaScript代码
  1. (function  (){  
  2.   alert(arguments.callee)  
  3. })();//弹出自身  

知道这个,我们就可以方便地递归自身了。如弄一个深拷贝函数

JavaScript代码
  1. var deepExtend = function(destination, source) {  
  2.   for (var property in source) {  
  3.     if (source[property] && source[property].constructor &&  
  4.      source[property].constructor === Object) {  
  5.       destination[property] = destination[property] || {};  
  6.       arguments.callee(destination[property], source[property]);  
  7.     } else {  
  8.       destination[property] = source[property];  
  9.     }  
  10.   }  
  11.   return destination;  
  12. };  

另外,从另一方便也启法了我们如何【廉】价地批量生产各种各样的自动执行函数。因为把函数转换为表达式的方法并不一定要靠分组操作符,我们还可以用 void操作符,~操作符,!操作符……

JavaScript代码
  1. void function(){  
  2.   alert("司徒正美");  
  3. }()  
  4.   
  5. 0, function(){  
  6.   alert("司徒正美");  
  7. }();  
  8. -function(){  
  9.   alert("司徒正美");  
  10. }();  
  11. +function(){  
  12.   alert("司徒正美");  
  13. }();  
  14. !function(){  
  15.   alert("司徒正美");  
  16. }();  
  17. ~function(){  
  18.   alert("司徒正美");  
  19. }();  
  20. typeof function(){  
  21.   alert("司徒正美");  
  22. }();  

 

 

 

 

--EOF--

自动执行函数确实有意思。。。

Tags: 司徒正美