2017-03-11 2 views
0

저는 실제로 인수가 내부에 전달되어야한다고 실제로 선언하지 않고 특정 방식으로 함수를 사용할 수 있다는 사실에 다소 혼란 스럽습니다.어떤 방법으로 미리 논쟁을해야합니까?

여기에 몇 가지 예가 나와 있습니다. 어떻게 해석 할 것인가에 따라 다르지만 전반적인 이론은 다소 이상하게 보입니다.

그래서 일반적으로 당신과 같이 변수 선언과 함께 인수를 전달합니다 :

def usualexample(x): 
     print x; 
     return False; 


somevarname = usualexample(5); 
somevarname; 

이 경우 5 인쇄 및 False를 반환 것이다. 그러나 JavaScript를 사용하는이 예제에서와 같이 어떤 경우에는 프로그래머가 실제로 다음과 같이 말하지 않고 함수에 이벤트를 인수로 전달하는 것을 알고 있지만 인수를 전혀 전달하지 않고 함수를 사용할 수 있습니다.

var innermost = document.getElementsByTagName("section"); 


for (var p = 0; p < innermost.length;p++){ 
    innermost[p].onclick = showinfo; 

} 




function showinfo(event){ 
    Do something with the event argument 
} 

pyhook 모듈과 파이썬의 또 다른 유사한 예는 다음과 같습니다

.onclick 가장 안쪽 [P]의 경우 그들이 알고있는 방법은 무엇 manager.KeyDown 선언의 경우
import pyHook; 
def dosomething(event): 
    do something with the event argument. 
manager = pyHook.HookManager(); 
manager.KeyDown = dosomething; 

인수를 사용하여 함수를 제공하려면 먼저?

아무도이 논리를 설명 할 수 없습니까? 나는 그들이 별개의 선언이고 완전한 다른 목적을 채우고 있음을 안다.하지만이 선언이 사실을 미리 지정하지 않고 함수에 인자를 제공하기 위해 미리 알고있는 것을 알 필요가있다.

답변

1

함수 코드를 실행하고 함수를 실행하지 않고 함수에 대한 참조를 저장하는 것과 차이가 있습니다. 함수를 쓸 때 :

function showinfo(event){ 
    console.log('showinfo executed'); 
} 

아무 것도 실행되지 않습니다. 함수가 실행될 때 수행 할 작업을 정의합니다. 이제 괄호를 사용하여 즉시 호출 할 수 있습니다.

showinfo(3); 

이렇게하면 메시지가 콘솔에 표시됩니다. 그러나 메소드의 참조 (일종의 이름과 같은)를 전달할 수도 있습니다. 따라서 작성한 경우 :

var innermost = document.getElementsByTagName("section"); 
innermost[0].onclick = showinfo; 

아무 일도 일어나지 않지만 브라우저가 내부적으로 클릭이 발생할 때 'showinfo'메소드를 호출하는 것을 알고 있습니다.당신도 자신의 코드에서이 작업을 수행 할 수 있습니다

var rememberedFunction; 
function rememberFunction(func) { 
    rememberedFunction = func; 
} 
function callFunction(value) { 
    if (rememberedFunction) { 
    rememberedFunction(value); // This calls the function you saved 
    } 
} 

rememberFunction(someinfo); // Nothing is output to the console 

// ... much later 
callFunction(3);   // The message is output to the console here 

당신은이 아약스 통화와 약속을 처리하는 브라우저 이벤트에서 상황의 모든 종류의 방법의 실행 옥수수 빵 게시 할 수 있습니다.

1

코드는 이며, 인수로 전달하는 코드는입니다. JS 및 pyHook의 이벤트를 처리하는 모든 것은 입니다. 항상은 핸들러에 이벤트 객체를 전달합니다. 이것에 관해서 마술 같은 것은 없습니다.

JS에서는 함수가 인수를 무시하는 것이 좋습니다. 따라서 다음은 합법적입니다.

function foo() { ... } 
foo('bar'); 

그러나 이것은 파이썬에서는 해당하지 않습니다. 0 인수를 취하는 함수를 후크에 할당하면 예외가 발생합니다.