0
<div id='dependent'>
<input type="button" value="Add" id='btn' onclick='addfunction()' />
</div>

<script type="text/javascript">

    var a = 1;
    var b = 1;
    var c = 1;

    function addfunction() {

        var c1 = document.createElement('input');
        c1.type = "checkbox";
        c1.id = "a" + a++;
        var c2 = document.createElement('input');
        c2.type = "checkbox";
        c2.id = "b" + b++;
        var c3 = document.createElement('input');
        c3.type = "checkbox";
        c3.id = "c" + c++;
        var c4 = document.createElement('br');


        document.getElementById("dependent").appendChild(c1);
        document.getElementById("dependent").appendChild(c2);
        document.getElementById("dependent").appendChild(c3);
        document.getElementById("dependent").appendChild(c4);
        // c1.onclick = dep();
        // function dep() { alert(this.id); }
        c1.onclick = function () { alert(this.id); };

    }
</script>

当我这样调用函数时,

c1.onclick = function () { alert(this.id); };

它按预期工作。即,当我单击复选框时,会显示警报及其 ID。

但是如果我以这种方式调用函数,

c1.onclick = dep();
function dep() { alert(this.id); }

当我单击“添加”按钮(在调用 addfunction() 时)时,会出现警报。为什么?

4

5 回答 5

9

因为您正在执行dep()并将返回值分配c1.onclick.

如果要分配函数本身,请不要调用它

c1.onclick = dep;
于 2013-05-10T06:24:48.810 回答
1

您正在传递函数调用的结果,而不是引用您需要在点击事件的异步调用时调用的函数。

所以改变这个

c1.onclick = dep(); 

c1.onclick = dep; 
于 2013-05-10T06:48:10.537 回答
1

原因是这dep()是一个函数调用表达式。所以你在这里实际做的是调用函数dep(),然后将结果 ( undefined) 分配给c1.onclick. 您应该改为执行以下操作:

function dep() { alert(this.id); }
c1.onclick = dep;
于 2013-05-10T06:25:48.437 回答
0

您不想将调用dep()(未定义)的结果分配给 onclick。您应该分配功能本身

 c1.onclick = dep;
于 2013-05-10T06:27:51.943 回答
0

编码

   c1.onclick = dep();

实际上调用dep。看括号???这就是他们所做的,他们实际上执行代码。匿名函数似乎是要走的路。不过要小心这个词。上

   c1.onclick = function () { alert(this.id); };

如果你“命名”它,这可以引用函数本身。由于您已经提到了 c1、c2 和 c3,您可以执行各种解决方案,例如:

c1.onclick=function() {alert(c1.id);}

或者

function click_handler(v_param) {alert(v_param.id);}
c1.onclick=function() {click_handler(c1);}

如果您尝试将其视为类似 C 或 C++ 的语言,则 JS 中的作用域可能会很棘手。

希望有帮助!

于 2013-05-10T06:28:14.587 回答