2016-06-11 4 views
0

다음은 function once (문제 13)이며 func을 사용하고 func을 한 번만 호출 할 수있는 함수를 반환합니다.JavaScript에서 닫은 다음 한 번 함수를 실행하십시오.

function add(a, b) { 
    return a + b; 
} 

function once(func) { 
    return function() { 
     var f = func; 
     func = null; 
     return f.apply(this, arguments); 
    }; 
} 

add_once = once(add); 
add_once(3, 4) // 7 
add_once(3, 4) // throws 

여기에 대해서는 두 가지 사항이 있습니다.

  1. func = null 쓰기는 함수를 두 번째 호출하지 못하게합니까? 함수에 포인터를 저장 한 후 (그것은 C Lingo를 사용하는 것이 맞습니까?) var f = funcnull을 할당하려고합니다. func (func은 함수 포인터 일뿐입니다. ?) 함수는 포인터가 (f에 이미 저장되어 있기 때문에) 부적절합니다. 내가 뭘 놓치고 있니?
  2. JavaScript의 특성 중 하나이기 때문에 간단히 f(arguments);이 아닌 necessary이라고 쓰면 f.apply(this, arguments);이됩니다. 후자는 인수에 대한 목록이 아닌 배열을 함수에 보냅니다. 그러나 나는 this이 무엇을 의미하는지 알지 못한다. 두 번째 줄의 익명 함수 또는 once을 참조합니까? func = null을 지정하면 클로저가 NULL이 아닌 func으로 이어지기 때문에 두 번째 호출을 중지하기위한 것이고 처음 호출 된 이유는 무엇입니까?

난 당신에게 내가하지 독립적으로 각 하위 문제를 해결하는 긴 대답을 입력하려는 기대, 누락 무엇을 식별하는 기회를 제공하기 위해 너무 많은 질문을 사용하고 있습니다.

+0

당신이 그것을 호출하는 방식으로, 'this'는 전역 객체가 될 것입니다. 또는 strict 모드에서는'undefined'가됩니다. 귀하의 질문에 대한 –

+0

1 : 미스터리는 키워드 "var"입니다. 변수를 "var"로 정의하면 현재 범위 나 상위 범위에서 동일한 이름의 변수 값을 모두 무시하고 현재 범위에 새로 할당 된 값을 사용합니다. 따라서 var f = func의 두 번째 호출은 f = null이됩니다. –

+0

@ Tolgahan : 코드는'var'없이 똑같이 작동합니다. –

답변

1

"왜 FUNC = 널 (null)이 두 번째 함수를 호출에서 우리를 막을 작성합니까?"

  • add_once가 처음 수행 될 때 수행되는 단계입니다.

    var f = func; step1 - 변수 f가 이제 매개 변수로 전달 된 add 함수에 대한 참조를 갖습니다. func는 여전히 add 함수에 대한 참조를 가지고 있으므로 이제 func와 f는 모두 동일한 add 함수를 가리 킵니다.

    func = null; step2 - 이제는 func가 null을 가리키고 더 이상 add 함수를 참조하지 않습니다. 그러나 vairable f는 여전히 add 함수를 참조합니다.

    return f.apply(this,arguments); step3 - f가 여전히 add 함수를 참조하기 때문에 arguments 배열에 함수를 전달하고 즉시 호출 할 수 있습니다. apply는 주어진 인자를 가진 add 함수를 즉시 호출합니다. 그런 다음 결과를 반환합니다. 'this'는 f가 참조하는 모든 것에 바인드됩니다.이 경우에는 add 함수입니다. 기억할 수있는 좋은 속임수는 '이'가 '왼쪽에있는 것이 무엇이든지간에 구속 될 것입니다.' 호출 사이트에서 일명 함수가 호출됩니다. 이 경우에는 정말로 중요하지 않습니다. 그 자리에 null을 넣을 수도 있고 괜찮을 것입니다. add_once이 촬영 새로운 단계는 두 번째로 실행됩니다

  • ....

    var f = func; 1 단계는 - 지금 우리가 참조하는 어떤 값 FUNC에 f를 가리 킵니다. 함수가 처음 실행될 때 func가 null을 가리 키기 때문에 func는 여전히 null을 참조합니다. 이제 f와 func는 모두 null을 가리 킵니다.

    func = null; step2 - 우리는 func 변수/매개 변수를 다시 null로 지정합니다. func는 이미 null을 가리키고 있었으므로 func은 null을 가리키고 있습니다.

    return f.apply(this,arguments); 3 단계 - 여기서 f는 여전히 null을 가리 킵니다. null은 함수가 아니기 때문에 분명히 null을 호출 할 수 없습니다. 다음은 오류가 발생한 위치입니다.

희망이 있습니다. 기억하고 싶은 것은 변수가 아무것도 저장하지 않는다는 것입니다. 변수는 값을 참조합니다. 저는 변수를 값을 가리키는 것으로 생각하고 싶습니다. 동일한 변수를 가리키는 변수가 여러 개있을 수 있습니다. 변수를 재 할당하면 해당 변수를 새로운 값으로 지정합니다.

1

당신은 두 번 다시 once를 호출하지 않는 기억 반환 된 함수가 값을 수정했기 때문에 더 이상 once에 전달 된 어떤 포인터입니다 반환 함수 내에서 사용 func, 을 볼 때 너무 once에 의해 제공되는 클로저 내부의 func이라는 변수에 의해 참조되는이라고하는 (반환 된 함수가 이미 이전에 호출 되었기 때문에). 처음 호출 된 후 func 값이 once에 전달 된 원래 값에서 null으로 변경되었을 때 반환 함수에서 반환 된 값이 반환되었습니다.

편집

는 나에게 의미가 있지만 그것은 도움이되지 않는 경우에, 나는 당신을 비난 할 수 없다, 난 그냥 쓴 읽은 후 : S

편집 # 2

질문의 두 번째 부분은 무엇입니까? this을 (를) 말합니다. 그것은 완전히 once에 의해 반환 된 함수를 호출하는 방법에 따라 다릅니다. 참조 this * 질문

* 말장난

+1

당신은 첫 몇 마디로 그것을 (제 오해) 찔렀습니다. 그러나 당신은 나로부터의 나머지를 나머지와 혼동했습니다. 나는 딜런의 대답을 읽은 후에 무슨 일이 일어나는지를 알아 냈으므로 나는 그의 대답에 체크 표시를하고 +1 할 것이다. – Calaf

관련 문제