let function FuncA() { for(var i = 0; i < 5; i++) { console.log(i); } console.log(i); } 위의 코드를 실행했을 때 C#이나 C++과 같은 다른 프로그래밍 언어에서는 7번 줄에서 소멸된 변수인 i 를 사용하기 때문에 오류가 난다. 하지만 JavaScript 에서는 변수의 범위를 함수의 블록 범위로 보기때문에 오류가 나지 않고 5라는 값이 출력이 된다. 이와 같은 문제를 해결하기 위해서 도입된 변수 선언 방법이 let이다. let 은 C# 또는 C++ 같은 언어에 와 같은 범위의 변수를 선언하게 된다. 그래서 아래의 소스코드에서는 오류가 출력된다. function FuncA() { for(let i = 0; i < 5; i++) { cons..
function funcA() { var text = "Hello"; return function () { console.log(text); } } var funcB = funcA(); funcB(); 위의 예제에서처럼 자바스크립트에서는 함수를 객체로 표현하기 떄문에 함수를 값으로 사용할 수 있고 내부함수에서는 외부함수의 필드에 접근할 수 있다. funcA 함수를 실행하면 text 변수를 출력하는 익명함수가 반환되고 이값을 funcB 에 넣은뒤 실행하면 Hello 라는 값이 console 에 출력된다. 클로저란 내부함수가 외부함수의 필드에 접근할 수 있고, 외부함수는 외부함수의 필드에 접근하는 내부함수가 소멸될 때까지 소멸되지않는 특성을 의미한다.
모듈이란 바닐라 자바스크립트에서는 존재하지 않는 개념으로 프로그램을 구성하는 작은 로직들을 의미한다. //index.html 위의 예제 코드에서 printHello 함수가 자주 사용되고 이 함수를 호출하려는 곳이 여러 곳일 때 위의 예제처럼 함수가 정의되어있으면 유지보수가 어렵고 사용되는곳마다 이 함수를 정의해주어야 한다. 이럴 때 모듈이 사용된다. // printHello.js function printHello() { alert("Hello"); } //index.html 위의 예제에서는 printHello 함수를 새로운 js 파일에 정의하고 js 파일을 index에서 불러와 사용하고 있다. js 파일의 이름은 원하는 파일명을 사용하면 된다.
DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); WaitForSingleObject 함수는 지정된 개체가 신호 상태가 되거나 시간 제한 간격이 경과할때 까지 기다린다. hHandle 개체의 핸들이며 대기가 아직 보류중인 동안 이 핸들이 닫히면 함수는 동작하지않는다. 핸들은 SYNCHRONIZE 엑세스 권한이 있어야한다. dwMilliseconds 지정된 값만큼 시간을 기다린다. 이 값이 0인 경우 객체가 신호받지않으면 대기상태로 들어가지않으며 항상 즉시 반환된다. 이 값이 INFINITE 인 경우 객체가 신호를 받을 떄만 함수가 반환된다. 이 함수가 성공적으로 실행을 완료하면 WAIT_ABANDONED, WAIT_OBJECT_0, W..
FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName ); GetProcAddress 함수는 특정 DLL에서 내보내기된 함수 또는 변수의 주소를 가져온다. hModule 함수 또는 변수를 포함하고있는 DLL 모듈에 대한 핸들을 나타낸다. LoadLibrary, LoadLibraryEx, LoadPackageLibrary, GetModuleHandle 함수를 통해 인자값을 채울 수 있다. lpProcName 함수 또는 변수의 이름이나 함수의 서수값을 의미한다. 이 함수가 성공적으로 실행을 완료하면 내보내기된 함수 또는 변수의 주소값이 반환된다. 함수의 실행이 실패하면 NULL 이 반환되며 실패에 대한 자세한 정보는 GetLastError 함수를 통해 알 ..
HMODULE GetModuleHandleW(LPCWSTR lpModuleName); GetModuleHandleW 함수는 특정 모듈에 대한 모듈 핸들을 검색한다. 모듈은 호출프로세스에 의해 로드되어 있어야한다. lpModuleName 로드된 모듈의 이름으로 확장자는 *.dll 또는 *.exe 이다. 이 매개변수가 NULL 일 경우, 호출 프로세스 ( *.exe )를 생성하는데 사용된 파일의 핸들을 반환한다. GetModuleHandleW 함수가 성공적으로 실행을 완료하면 특정 모듈의 핸들을 반환한다. 함수의 실행이 실패할 경우 NULL 을 반환하며 실패에대한 자세한 정보는 GetLastError 함수를 통해 알 수 있다. Example HMODULE hMod = GetModuleHandle(L"kern..
BOOL WriteProcessMemory(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer, SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten ); WriteProcessMemory 함수는 특정 프로세스의 메모리영역에 데이터를 쓰기한다. hProcess 메모리를 수정할 프로세스의 핸들이다. 이 핸들은 반드시 PROCESS_VM_WRITE 와 PROCESS_VM_OPERATION 권한을 가져야한다. lpBaseAddress 데이터 쓰기를 시작할 프로세스의 메모리주소이다. 데이터 쓰기를 시작하기전 시스템은 지정된 크기의 주소와 메모리의 모든 쓰기 접근이 가능한지 확인하고, 접근할 수 없는경우 함수는 실패한다. lpBuffer ..
LPVOID VirtualAllocEx(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect); VirtualAllocEx 함수는 특정 프로세스의 가상 주소 공간 내에서 메모리 영역의 상태를 변경, 할당, 해제하고, 할당하는 메모리를 0으로 초기화한다. hProcess 특정 프로세스의 핸들이며 이 프로세스의 가상 주소 공간 안에 메모리 영역을 할당한다. 이 핸들은 반드시 PROCESS_VM_OPERTATION 권한을 가지고 있어야한다. 권한에 대한 자세한 정보는 MSDN 에서 확인할 수 있다. lpAddress 할당할 페이지 영역에 대해 시작주소를 지정하는 포인터이다. lpAddress 가 NULL..