2010-06-28 63 views
3
function runSomething() { 
    // some stuff happens 
} 

$(selector).bind('event', runSomething()); 

$(selector).bind('event', runSomething); 

这两个版本的绑定有什么区别?2 jquery绑定之间的区别

这里有一个实际的例子: http://jsbin.com/icajo/edit

有人可以解释为什么工作它的方式。

我想获得多个按钮来运行该事件的功能,我该怎么办?

回答

0

在JavaScript中,将一组参数传递给一个函数调用该函数,它将被计算为函数的返回值。

var test = function() { return 1; } // Creates a new function that returns 1 
alert(test.toString()); // => "function() { return 1; }" 
alert(test().toString()); // => "1" 

即使alert本身只是一个指向函数的变量。

alert(alert); // => "function alert() { [native code] }" 

因此,如果第一个例子中,主叫runSomething()时,它会立即评估该功能,随后将返回值作为参数来bind()。你的情况,它的evals alert()作为加载页面时,然后传递到undefinedbind()

在第二示例中,使用本身被传递到bind()可变runSomething的功能。只有当事件发生后,绑定才会使用该函数。

要真正打击你的心,你可以有函数返回一个函数,然后计算函数(如在你的第一个例子)是正确的......例如

var counter = 0; 
function GenerateNext() { 
    counter++; 
    return new Function("alert(" + counter + ")"); 
} 

a = GenerateNext(); 
b = GenerateNext(); 
b() // will alert 2 
a() // will alert 1 

$(selector).bind('event', GenerateNext()); // alert 3 
$(selector).bind('event', a); // alert 1 
$(selector).bind('event', b); // alert 2 

这只是一切都取决于什么你正在努力去做;传递函数本身,或传递函数的返回值。

5

在第一种情况下,您将调用runSomething()的结果绑定到第二个函数本身。

更新
@JSNewbie,运行这个并告诉你在每个警报看到。

function runSomething() { 
    return 3; 
} 

var a1 = runSomething(); 
var a2 = runSomething; 
alert(a1); 
alert(a2); 
+0

那么在第二个版本中,东西不会发生? – JSNewbie 2010-06-28 16:37:14

+0

@JSNewbie:第二个版本在事件上运行函数,而第一个版本在事件发生时运行绑定时由函数返回的内容。 – tcooc 2010-06-28 16:40:10

+0

抱歉太理论了,我不明白。有人可以根据我的实际例子来解释。 – JSNewbie 2010-06-28 16:44:18

0

在功能runSomething是绑定语句中执行的第一线,而它返回什么必然的事件,例如,如果您runSomething函数返回另一个函数,那么该函数的约束,并会在事件中执行。

在第二行,runSomething函数不在该行执行,并且仅在发生“事件”时才执行。

0

$(selector).bind('event', 'runSomething()');(请注意在'runSomething()'左右的附加引号) 当收到事件时运行功能runSomething()

$(selector).bind('event', runSomething); 设置功能runSomething()作为该事件的回调函数,这意味着它将收到任何参数都包含在事件中,往往这是currentTarget当前(这样你就可以使用许多按钮相同的事件)或有用从事件中获取特定信息(mousemove返回触发时鼠标的X,Y位置)。

因此,如果您需要访问事件触发时返回的事件对象,则第一个版本将无法正常工作。

function runSomething(event){ 
    console.log(event); // this would show the event object if the second code is used. 
} 
0

在JavaScript函数被视为变量。添加“()”将调用函数,并传递函数的结果(如果该函数不返回任何内容,则可能是'未定义')。第二种是使用bind方法的正确方法,因为它给出了在触发事件时要调用的函数的句柄。