司徒正美,不用多介绍了吧?博客园上,JS牛人。就象他说的,取名叫ruby并不一定就是玩ruby的(额,好象没记错)
上原文吧,因为我对JS的了解还处于较初级的阶段,所以关注的就比较多了,原文来自:http://www.cnblogs.com/rubylouvre/archive/2010/02/11/1667364.html,原文有JS的执行功能,可以尝试。
请看以下两个函数:
JavaScript代码
- function a(){
- alert("a")
- }
- var b = function(){
- alert("b")
- }
JavaScript代码
- function a (){
- alert("a")
- }();//报错
- var b = function(){
- alert("b")
- }();
- (function foo(){}); // 表达式:注意它被包含在分组操作符中
- var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分
- new function bar(){}; // 表达式,因为它是New表达式的一部分
给 function 外套一对括号(分组操作符)就不报错了,括号是表达式,是表达式就有返回值,所以可以在后面加一对括号让它们执行,再看
JavaScript代码
- (function a (){
- alert("a")
- })();//没有问题
另外,我们知道,函数名的作用就是用来引用的,现在没用了,我们是不是可以把它去掉呢?
JavaScript代码
- (function (){
- alert(arguments.callee)
- })();//弹出自身
知道这个,我们就可以方便地递归自身了。如弄一个深拷贝函数
JavaScript代码
- var deepExtend = function(destination, source) {
- for (var property in source) {
- if (source[property] && source[property].constructor &&
- source[property].constructor === Object) {
- destination[property] = destination[property] || {};
- arguments.callee(destination[property], source[property]);
- } else {
- destination[property] = source[property];
- }
- }
- return destination;
- };
另外,从另一方便也启法了我们如何兼【廉】价地批量生产各种各样的自动执行函数。因为把函数转换为表达式的方法并不一定要靠分组操作符,我们还可以用 void操作符,~操作符,!操作符……
JavaScript代码
- void function(){
- alert("司徒正美");
- }()
- 0, function(){
- alert("司徒正美");
- }();
- -function(){
- alert("司徒正美");
- }();
- +function(){
- alert("司徒正美");
- }();
- !function(){
- alert("司徒正美");
- }();
- ~function(){
- alert("司徒正美");
- }();
- typeof function(){
- alert("司徒正美");
- }();
--EOF--
自动执行函数确实有意思。。。