2013-10-12 1 views
-1

이 코드는 정상적으로 작동합니다.자바 스크립트, 왜 "new Function()"을 사용해야합니까?

<input id="mainCheckbox" type="checkbox"/> 
... 
var controlCheckbox = document.getElementById("mainCheckbox"), 
... 
controlCheckbox["onclick"] = new Function("controlCheckbox.Notify(controlCheckbox.checked)"); 

왜이 기능이 작동하지 않습니까?

controlCheckbox["onclick"] = controlCheckbox.Notify(controlCheckbox.checked); 
+1

두 번째 코드는 동작이 완전히 다르기 때문에 작동하지 않습니다. 새로운 연산자가 실제로하는 일에 대해 더 잘 이해해야합니다. –

답변

5

기능을 할당하지 않기 때문에 작동하지 않지만 대신 .Notify을 즉시 호출합니다.

그러나 익명 함수 구문을 사용하여 함수를 만들 수는 있습니다.

controlCheckbox["onclick"] = function() { 
    controlCheckbox.Notify(controlCheckbox.checked); 
}; 

이 방법은 Function 생성자를 사용하는 것보다 일반적인 방법입니다.

두 가지 방법의 차이점 중 하나는 new Function에서 생성 된 함수가 포함 된 로컬 변수 범위를 사용할 수 없다는 것입니다. 마치 global 범위에서 직접 생성 된 것입니다. 첫 번째 코드 예제에서 변수가 global 범위에 포함되는 경우에만 controlCheckbox 변수가 액세스 할 수 없습니다 때문에

;(function() { 
    var foo = "bar"; // local variable 

    var x = new Function("console.log(foo);"); 

    x(); // ReferenceError: foo is not defined 
})(); 

그래서, 그것은 작동하지 않습니다.

변수가 바인딩되는 요소에 대한 단순한 참조이기 때문에 처리기에서 this을 사용할 수 있으므로 실제로 변수가 필요하지 않습니다.

controlCheckbox["onclick"] = new Function("this.Notify(this.checked)"); 
관련 문제