2013-05-10 211 views
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> 

當我打電話這樣的功能,使用Javascript - 調用函數

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

它按預期工作。即,當我點擊複選框時,警報將顯示其ID。

但是,如果我調用這個方法,函數,

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

出現警報,當我點擊「添加」按鈕(在調用調用addFunction())。爲什麼?

+0

因爲你在呼喚它,沒有它分配給事件。 而在前一箇中,您正在附加一個函數,而不是在此時調用。 – 2013-05-10 07:46:12

回答

9

因爲您是正在執行dep()並將返回值指定爲c1.onclick

如果你要分配的功能本身,不要把它

c1.onclick = dep; 
1

的原因是,dep()是一個函數調用表達式。所以你在這裏實際做的是調用函數dep(),然後將結果(undefined)分配給c1.onclick。你應該做的,而不是執行以下操作:

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

其實他分配'undefined'和not' null'。 – 2013-05-10 06:27:11

+0

@JohannesLumpe正式注意。 – JLRishe 2013-05-10 08:28:00

0

你不想分配調用dep()(不確定)到的onclick的結果。您應該分配的功能本身

c1.onclick = dep; 
0

代碼

c1.onclick = dep(); 

實際調用DEP。參見括號???。這就是他們所做的,他們實際上執行了代碼。匿名功能似乎是要走的路。儘管謹防這個這個詞。 On

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

這可以引用函數本身,如果你「命名」它。既然你已經refered到C1,C2和C3可以做喜歡的各種解決方案:

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

如果試圖看它作爲一個C或者
function click_handler(v_param) {alert(v_param.id);} 
c1.onclick=function() {click_handler(c1);} 

範圍,JS可能會非常棘手C++喜歡的語言。

希望有所幫助!

+2

該問題與範圍無關 – 2013-05-10 06:30:03

+1

問題是,OP正在調用該函數並分配結果而不是分配它,與範圍 – 2013-05-10 06:33:27

+0

無關。哦,我明白了。我只是想指出使用非匿名函數時的範圍界定問題,以防您想要試用它們。另外,你說運輸,而不是範圍,這就是爲什麼我沒有得到它。我不知道爲什麼我得到了你是OP的印象... – 2013-05-10 06:35:13

1

您傳遞函數調用代替參考該功能,你會需要上單擊事件異步調用被調用的結果。

所以改變這種

c1.onclick = dep(); 

c1.onclick = dep;