다음은 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
여기에 대해서는 두 가지 사항이 있습니다.
- 왜
func = null
쓰기는 함수를 두 번째 호출하지 못하게합니까? 함수에 포인터를 저장 한 후 (그것은 C Lingo를 사용하는 것이 맞습니까?)var f = func
에null
을 할당하려고합니다.func
(func
은 함수 포인터 일뿐입니다. ?) 함수는 포인터가 (f
에 이미 저장되어 있기 때문에) 부적절합니다. 내가 뭘 놓치고 있니? - JavaScript의 특성 중 하나이기 때문에 간단히
f(arguments);
이 아닌 necessary이라고 쓰면f.apply(this, arguments);
이됩니다. 후자는 인수에 대한 목록이 아닌 배열을 함수에 보냅니다. 그러나 나는this
이 무엇을 의미하는지 알지 못한다. 두 번째 줄의 익명 함수 또는once
을 참조합니까?func = null
을 지정하면 클로저가 NULL이 아닌func
으로 이어지기 때문에 두 번째 호출을 중지하기위한 것이고 처음 호출 된 이유는 무엇입니까?
난 당신에게 내가하지 독립적으로 각 하위 문제를 해결하는 긴 대답을 입력하려는 기대, 누락 무엇을 식별하는 기회를 제공하기 위해 너무 많은 질문을 사용하고 있습니다.
당신이 그것을 호출하는 방식으로, 'this'는 전역 객체가 될 것입니다. 또는 strict 모드에서는'undefined'가됩니다. 귀하의 질문에 대한 –
1 : 미스터리는 키워드 "var"입니다. 변수를 "var"로 정의하면 현재 범위 나 상위 범위에서 동일한 이름의 변수 값을 모두 무시하고 현재 범위에 새로 할당 된 값을 사용합니다. 따라서 var f = func의 두 번째 호출은 f = null이됩니다. –
@ Tolgahan : 코드는'var'없이 똑같이 작동합니다. –