Noob javascript,为什么这个解雇onload?

时间:2012-08-01 18:38:32

标签: javascript

所以我不明白为什么控制台会立即登录1或者我有one.onclick = alterIt(1)的东西不应该等到我点击one。无论如何,显然我不擅长javascript,谢谢你的帮助。

window.onload = initialize;
function initialize() {
    if (1 == 1){
        calculation();           
    }
}
function calculation() {
    var one = document.getElementById('one');
    one.onclick = alterIt(1);
}

function alterIt(x) {
    console.log(x);
}

5 个答案:

答案 0 :(得分:9)

当你写道:

one.onclick = alterIt(1); 

...然后你调用alterIt函数并将返回值设置为onclick处理程序。相反,你想要:

one.onclick = function(){ alterIt(1) };

// ...or better yet
one.addEventListener('click',function(){ alterIt(1) },false);

答案 1 :(得分:4)

执行第one.onclick = alterIt(1);行时,实际评估alterIt(1)。你想要的是将函数绑定到one.onclickonclick仅在one.onclick = function() { alterIt(1) }; 事件触发时执行。你需要像

这样的东西
alterIt(1)

不会将one.onclick的结果绑定到{{1}},而是功能评估的结果。

答案 2 :(得分:2)

像这样包裹函数调用,因此在点击之前不会触发:

window.onload = initialize;
function initialize() {
    if (1 == 1){
        calculation();           
    }
}
function calculation() {
    var one = document.getElementById('one');
    one.onclick = function(){ alterIt(1);};
}

function alterIt(x) {
   console.log(x);
}

示例小提琴:http://jsfiddle.net/RkH6Q/

答案 3 :(得分:2)

您可以使用两种方法来解决此问题:

//Anonymous Closures
one.onclick = function(){ alterIt(1); };

//Bind Closures  
one.onclick = alertIt.bind(window, 1);

注意:一年内所有浏览器都支持Function.bind()。如果您关心旧浏览器,那么匿名关闭就是您的选择。

答案 4 :(得分:-2)

发生的事情是你在调用alterIt函数时应该只是传入它。所以删除括号如下:

one.onclick = alterIt;