2 jquery绑定之间的区别

时间:2010-06-28 16:33:43

标签: javascript jquery

function runSomething () {
  // some stuff happens
}

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

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

这两个版本的绑定有什么区别?

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

有人可以解释为什么会这样做。

我正试图让多个按钮在事件中运行该功能,我该怎么办?

5 个答案:

答案 0 :(得分:5)

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

<强>更新
@JSNewbie,运行它并告诉你在每个警报中看到的内容。

function runSomething () {
    return 3;
}

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

答案 1 :(得分:0)

在第一行中,函数runSomething在bind语句中执行,并且它返回的内容绑定到事件,例如,如果runSomething函数返回另一个函数,那么该函数被绑定,并将在事件上执行

在第二行,runSomething函数不在该行执行,仅在“event”发生时执行。

答案 2 :(得分: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.
}

答案 3 :(得分:0)

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

答案 4 :(得分: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()。在您的情况下,它会在页面加载时逐出alert(),然后将undefined传递给bind()

在第二个示例中,使用变量runSomething将函数本身传递给bind()。绑定然后仅在事件被引发时才使用该函数。

要真正打动你的想法,你可以拥有返回函数的函数,然后评估函数(就像在你的第一个例子中一样)是正确的......例如

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

这完全取决于你想要做什么;传递函数本身,或传递函数的返回值。