2013-07-03 6 views
0

저는 myVar이라는 변수가 있습니다. 체크 상자를 클릭하면 값이 변경됩니다. 체크 박스를 클릭하면 해당 값을 1로 표시하는 경고 상자가 나타납니다. 선택을 취소하면 값이 0 인 경고 상자가 다시 표시됩니다.잡히지 않은 ReferenceError 함수가 정의되어 있지 않습니다.

이제 두 가지 질문이 있습니다.

  1. 내가 Submit을 클릭하여 문서를 제출하려고

    는 내가 Uncaught ReferenceError: confirm_submit is not defined 같은 오류가 발생합니다. 왜?
  2. 나는 내가 오류가 발생하지 않지만 그 경우 confirm_submit 기능을 내부에 두 번째 경고 상자가 myVar에 대한 undefined 보여줍니다 ready event 밖으로 confirm_submit 기능을 넣어합니다. 왜? 함수 내에서 myVar에 액세스 할 수 없습니까?

코드 :

<html> 
<head> 
<script type="text/javascript" src="js/jquery.js"></script> 
<script type="text/javascript" src="js/jquery.treeTable.js"></script> 
<script type="text/javascript"> 
var myVar; 
jQuery(document).ready(function() { 
    $("#myTable2").treeTable({ 
     expandable: true, 
     clickableNodeNames: true, 
     initialState: "expanded", 
    }); 
    document.getElementById('myVar').addEventListener('click', myVar, false); 

    function myVar() { 
     if (document.getElementById('myVar').checked === true) { 
      myVar = 1; 
     } else { 
      myVar = 0; 
     } 
     alert(myVar); 
    }................. 
    some functions.................... 

    function confirm_submit() { 
     alert(myVar); 
     if (confirm('Press OK to confirm')) { 
      document.myform.myVar.value = myVar; 
      document.myform.submit(); 
      reload_parent_and_close_window(); 
     } 
    } 
    and some more functions..................... 
}); 
</script> 
</head> 
<body> 
    <form name="myform" id="myform" action="$action" method="post" onsubmit="return false;"> 
    <input type="checkbox" name="myVar" id="myVar" value="myVar">Text here 
    </form> 
    <a href="javascript:confirm_submit()">Submit</a> 
</body> 
</html> 
+1

어쩌면 당신이 (확인 '과 같은 기존의 전역 함수와 동일한 함수 이름을 선택하지 않도록해야합니다)를': 제출 함수 또는'window.confirm'를 호출해야합니까? – fcalderan

+0

내 코드가 다른데 프라이버시 이유 때문에 여기에 이름을 변경했습니다. –

답변

3

여기 몇 가지 기본 개념, 일부 JavaScript 프로그래밍 기본 사항을 이해하지 못하는 것 같습니다.

function myVar() { 
    ... 
    alert(myVar); 
} 

여기서 무엇을 기대 했습니까? myVar 함수와 myVar 변수는이 범위에서 같습니다. 변수를 선언하고 같은 이름의 함수를 선언하면 함수는 스택의 변수를 대체합니다. 또한 자바 스크립트에는 블록 범위가 없습니다. 함수에 선언 된 모든 것은 블록에 관계없이 컴파일러에 의해 먼저 선언됩니다. 그래서 ...

function a() { 
    var a = 1; 
    if (1) { 
     var b = 4; 
     alert(b); 
    } 
    alert(b); 
} 

범위 지정이 Java 또는 C++과 동일하다고 가정하지 마십시오.

또한 무언가를 명시 적으로 전역으로 지정하려면 명시 적으로 지정하십시오. myVar 함수의 이름을 "onClick_myVar"와 같은 의미있는 이름으로 변경하십시오. 함수가 선언 된 곳 전에 그런 다음 즉시 폐쇄 내부의 기능을 넣어 사용자의 상태 변수 선언

(function() { // Closure 
    var myVar; 

    function onClick_myVar() { 
     if ($(this).getattr("checked")) { 
      myVar = 1; 
     } else { 
      myVar = 0; 
     } 
     alert(myVar); 
    } 

    $('#myVar').click(onClick_myVar); 
})(); 
+0

어리석은 나를, 기능 및 변수, 수정 주셔서 감사에 동일한 이름의 사용을 보지 못했어요. –

2
function myVar() { 
    if (document.getElementById('myVar').checked === true) { 
     myVar = 1; 
    } else { 
     myVar = 0; 
    } 
    alert(myVar); 
} 

한 번만 작동합니다. 함수 myVar을 입력하자마자 1이나 0으로 값 (함수는 JS의 객체 임)을 바꿀 것이고 더 이상 함수 객체가 아니라 숫자가됩니다.

문제가
0

... 당신은 당신의 VAR 및 입력 요소 ..에 대해 같은 이름을 가진

document.myform.myVar.value = myVar; 

그래서 someother 변수에 입력 요소의 ID를 변경하거나 모든 myVar에 이름을 변경하거나

<input type="checkbox" name="myVar" id="inputId" value="myVar">Text here 

document.myform.inputId.value = myVar; 
관련 문제