2017-12-30 76 views
1

한 번만 실행하는 기능을 원합니다. 나는 여기에 this question을 찾았고 가장 많이 투표 된 예제는 함수를 재정의 한 다음 한 번 실행해야하는 코드를 실행합니다. 코드를 실행 한 다음 함수를 다시 정의하는 대신에 그렇게하는 것이 바람직한 이유가 있지만 그게 무엇인지 알아낼 수는 없습니다. 내 첫 번째 본능은 코드가 실행 된 후 함수를 재정의하는 것입니다. 왜냐하면 코드가 재정의되기 전에 실행되어야하기 때문에 "안전합니다"라고 생각하기 때문입니다.한 번만 실행되는 함수를 만들 때 함수 이전 또는 이후에 재정의가 수행되어야합니까?

대회가 ​​처음으로 재정의되는 것으로 보이는 이유를 설명 할 수 있습니까?

+0

질문에 관련 언어 태그를 추가하십시오. –

+0

만약 당신이'javascript'에 대해 이야기하고 있다면 아무런 차이가 없습니다. 스레딩이 없기 때문에 - 하나의 이벤트 루프 만 있습니다. 당신의 함수는 여러 스레드로부터 동시에 호출 될 수 없지만 순차적으로 만 호출 될 수 있습니다. js의 이벤트 루프에 대한 자세한 정보 https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop – ironstone13

+0

다중 스레드 환경에서 여러 번 실행되는 것을 방지해야합니다. 말이된다! 예, JavaScript를 사용하고 있지만 일반적인 질문 이었으므로 그 사실을 알리지 않았습니다. 나는이 질문이 더 광범위하게 적용 되더라도 널리 사용되기 때문에 JS 태그를 추가했다. 답장을 보내 주셔서 감사합니다. –

답변

-1

주된 이유는 멀티 스레드 언어입니다. 함수가 한 번만 실행되고 첫 번째 인스턴스가 완료되기 전에 함수가 두 번 호출되면 두 번 이상 호출하게됩니다. 다시 정의하면 함수가 두 번 실행될 수 없습니다.

+0

JS가 다중 스레드되지 않습니다. 또한 가능한 한 빨리 장애를 일으키는 다중 스레드 언어에서는 경쟁 조건의 가능성이 줄어들지 만 적절한 해결책을 위해서는 세마포 또는 원자 연산이 필요합니다. – Bergi

+0

나는 JS가 멀티 스레드라고 말하지 않았다. 원래의 질문에 대한 주석에서 언급했듯이 JS에 대해서는 순서가 중요하지 않습니다. 나는이 질문을 찾는 다른 누구라도 함수를 재정의하는 것이 왜 먼저 이루어질지에 대한 근거를 가질 수 있도록 내 자신의 질문에 대답하고있다. –

0

기본적으로이 기능이 두 번 호출되지 않도록하려면 첫 번째 호출 직후에 기능을 사용하지 않도록 설정하는 것이 가장 안전합니다. 외침과 불신자 사이에 아무 것도 일어나지 않으면 예기치 않은 일도 일어나지 않을 것입니다.

  • 코드가 반복적으로 함수를 호출하거나 콜백을 통해 - 당신은 던져 않습니다 reentrancy
  • 코드를 고려해야합니다 : 처음 한 번만 실행되어야하는 코드를 실행한다면, 다양한 일이 일어날 수 예외
  • 코드 return의 초기
다음 각 호의 어느 하나에 해당하는 경우에

, 그리고 아마도 더는 해제 코드는 도달되지 않고 두 번째 호출 할 수 있습니다.

함수를 바꾸는 것만으로는 충분하지 않습니다. 호출자는 다른 변수를 noop 함수로 설정하여 영향을받지 않고 원래 함수를 보유하는 별칭 변수를 쉽게 만들 수 있습니다. 호출 코드를 제어하고 코드가 무엇인지 알지 않는 한 항상이 솔루션을 accepted answer의 "정적 부울 변수"접근 방식과 결합해야합니다.