Go에서 defer 문은 주변 함수가 반환될 때까지 함수 실행을 연기합니다. 다음은 간단한 예입니다.
package main import "fmt" func main() { fmt.Println("start") defer fmt.Println("defer 1") defer fmt.Println("defer 2") fmt.Println("end") }
이 예에서 main 함수는 정상적으로 실행되지만, 함수가 종료되면 모든 deferred 함수가 역순으로 실행됩니다. 따라서 출력은 다음과 같습니다.
start end defer 2 defer 1
이제 JavaScript에 defer 키워드를 추가하려면 많은 작업이 필요합니다. 하지만 제가 JS를 좋아하는 이유는 바로 이것이기 때문입니다. JS는 컴파일러를 건드릴 필요 없이 다른 프로그래밍 언어의 기능을 구현할 수 있을 정도로 다재다능합니다.
그런데 먼저 이것이 왜 필요한가요?
다음과 같이 프로그래밍에서 유사 연기 기능에 대한 유용한 사용 사례가 많이 있습니다.
그리고 목록은 계속됩니다...
이제 재미있는 부분인 JavaScript의 defer 구현에 대해 살펴보겠습니다.
class Deferer { static stack = []; static wrapped = false; static defer(fn) { this.stack.push(fn); if (!this.wrapped) { throw new Error("can't call defer wihtout wrapping the function with Deferer.wrapper") } } static execute() { while (this.stack.length > 0) { const fn = this.stack.pop(); try { fn(); } catch (err) { throw new Error('Error in deferred function:', err); } } this.wrapped = false; } static wrapper = (cp) => (...args) => { if(this.wrapped) throw new Error("nested deferers are not supported"); this.wrapped = true; try { const v = cp(...args) this.execute() return v; } finally { this.wrapped = false; } } } const myDeferedFunction =Deferer.wrapper((a, b, c) => { console.log("Start of function", a, b, c); Deferer.defer(() => console.log("Deferred: Function 1")); Deferer.defer(() => console.log("Deferred: Function 2")); console.log("End of function", a, b, c); }); myDeferedFunction(8,8,8)
출력:
Start of function 8 8 8 End of function 8 8 8 Deferred: Function 2 Deferred: Function 1
예상대로 지연된 함수는 주 함수가 완료된 후 역순으로 실행됩니다.
감사합니다.
아흐메드
위 내용은 Golang의 개념을 Javascript로 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!