2013-01-25 199 views
3

可能重复:
Why does click event handler fire immediately upon page load?事件处理程序自动点击事件触发 - jQuery的

有一个在我的JavaScript的功能的理解,所以我很难理解为什么我的事件处理程序得到一个缺口如果我在没有匿名包装的情况下定义它,它会自动启动。

HTML

<a href="#" id="change-html">Change HTML</a> 

的Javascript#1

var btn = $('#change-html'); 
btn.click(bindClick(btn)); // bindClick gets executed right away and only once 

function bindClick(source){ 
    console.log('get here'); 
} 

的Javascript#2

var btn = $('#change-html'); 
btn.click(function(){ 
    bindClick(btn); // bindClick is only executed on the anchor's click event 
}); 

function bindClick(source){ 
    console.log('get here'); 
} 
+0

'()'函数引用后** **调用功能。你认为在这个例子中首先执行了哪个函数:'foo(bar())'?当绑定事件处理程序:) –

+0

非常感谢。现在很明显。 –

回答

6

其实这里

btn.click(bindClick(btn)); 

你的函数的返回值只是结合的Click事件,而不是函数本身。
由于在JavaScript就可以返回一个函数这会工作

var btn = $('#change-html'); 
btn.click(bindClick(btn)); 

function bindClick(source){ 
    return function() { 
     console.log('get here'); 
    }  
} 

http://jsfiddle.net/VZ4Gq/

编辑 - ?是第二个函数闭包是的,它可能be.Let的永乐在这个例子中

var btn = $('#change-html'); 
btn.click(bindClick(btn)); 
// global scope 
var inside = "i'm outside a closure"; 
console.log(inside); 
function bindClick(source){ 
    // local scope 
    var inside = "i'm inside a closure"; 
    return function() { 
     console.log(inside); 
    } 
} 

http://jsfiddle.net/VZ4Gq/1/

当您尝试此操作时,您会记录“我在关闭之外”第一个然后当你点击按钮时,你会看到“我在关闭中”。这是因为你实际上创建了一个封闭和的高效多功能,当它的executo,它执行的是原来的范围,这是内部bindClick()

+0

谢谢。我仍然在努力理解关闭。 –

+0

或者,甚至更好的办法是修改你的'bindClick'函数,所以你不需要参数 - 你已经在事件处理函数中有'this'来引用触发事件的元素,传入它并不会真正地任何意义(这只是一个额外的,不必要的复杂)。那么你可以这样做:'btn.click(bindClick);' –

+0

@LimH。这不是一个闭包,一个闭包它是一个不同的东西,这与Felix King在评论中明确解释的函数执行顺序有关。 我的例子只是告诉你BindClick在btn.click()之前执行,因此BtnClick的返回值(这是一个函数)被指定为事件处理程序。 –

1

的问题是:

btn.click(bindClick(btn)); 

它会调用bindClick方法。 尝试改变该行与此,看看行为,如果同一个用JavaScript#2:

btn.click({param1: btn }, bindClick); 

或者更简单:

btn.click({param1: btn }, $(this)); 
+0

'btn.click({param1:btn},$(this));' - 你能解释一下吗? bindClick函数在哪里? –

+0

@LimH。该代码没有任何有效的解释,因为它不正确。 –