2010-09-29 30 views
1

我是JavaScript新手,我正在翻阅一些Raphael演示代码。我很困惑,这是如何工作的...如何/何时调用这个匿名函数?

if (R) { 
    (function (dx, dy, R, value) { 
     var color = "hsb(" + [(1 - R/max) * .5, 1, .75] + ")"; 
... 

从我可以看到这是声明一个匿名函数,它需要4个参数。当这个函数没有名字时,这个函数是如何被调用的?

演示页.. http://raphaeljs.com/github/dots.html

JS文件.. http://raphaeljs.com/github/dots.js

+0

js文件有点长,我找不到'if(R){'在里面。你能在这里发布更多的代码吗? – jrharshath 2010-09-29 14:47:27

+0

对不起,我想我不会包含足够的代码来找出发生了什么,这就是为什么我链接到源。无论如何,现在已经得到了答复,谢谢! JS文件不是*很长 - 只有几个屏幕已满 - 引用的部分刚好在一半以下。 – 2010-09-29 14:54:06

回答

2

要简要回答您的问题,它会在删除后立即调用。

你忽略了一个重要的组成部分,函数定义的末尾:

})(leftgutter + X * (j + .5) - 60 - R, Y * (i + .5) - 10, R, data[o]); 

它说的是},从而结束了功能,那么),从而结束与(function开括号。如果剩下的东西看起来像一个参数列表,那是因为它是。

的说明性实例:

(function(arg){ alert(arg); })("Hi!"); 
1

你没有包括足够的代码来讲述。看着源码,这个方法立即执行。忽略该函数的内容,它看起来像这样

(function (dx, dy, R, value) { 

// ... stuff 

dot[0].onmouseover = function() { 
    if (bg) { 
     bg.show(); 
    } else { 
     var clr = Raphael.rgb2hsb(color); 
     clr.b = .5; 
     dt.attr("fill", Raphael.hsb2rgb(clr).hex); 
    } 
    lbl.show(); 
}; 

// more stuff 

})(leftgutter + X * (j + .5) - 60 - R, Y * (i + .5) - 10, R, data[o]); 

这一切都发生在循环内,并且变量在事件处理程序方法中被引用。匿名方法会创建一个新的作用域,以便保留循环运行时的值,而不是让每个事件处理程序都指向变量保存的最后一个值。

1

这就是所谓的28条后线:

... 
    })(leftgutter + X * (j + .5) - 60 - R, Y * (i + .5) - 10, R, data[o]); 

所以这些都是四个参数。

如果你不给函数一个名字,你可以用它做的唯一事情就是在那里调用它,或者将它传递给其他人。

window.addEventListener("load", function(event) { 
    document.body.innerHTML = "hello"; 
}, false); 

在这种情况下,它是用来控制变量的作用域,以保证循环迭代完成后,它们的值是不重复使用:如果你熟悉的事件监听器这是非常标准。许多库将整个脚本封装在功能块中,仅用于创建新的范围。 (不像其他大括号语言,一个{ }块独行创建一个新的讨论范围)。

(function() { 
    var foo; // guaranteed to not leak or interfere with someone else's foo 
    // 6000 lines ... 
})(); 

阅读JavaScript Scope and Closures

+0

谢谢,我会阅读事件听众。 – 2010-09-29 14:52:43

1

,创建匿名函数和调用的飞行。一个简化的版本将是

function(a){<some method code>}(x); 

在该值x是在函数a通过。在你的例子中,函数稍后被调用:

(function (dx, dy, R, value) { 
    var color = "hsb(" + [(1 - R/max) * .5, 1, .75] + ")"; 
    ... 
})(leftgutter + X * (j + .5) - 60 - R, Y * (i + .5) - 10, R, data[o]);