所以我不明白为什么控制台会立即登录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);
}
答案 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.onclick
,onclick
仅在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);
}
答案 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;