2017-12-29 21 views
2

알아 보았는 없다.부정 값 "F1은 ...."

지금은 test2와 test2의 올바른 결과 대신에 이 정의되지 않았 음이됩니다.

function f(x) { 
    console.log(x); 
} 

function delay(f, ms) { 
    return function() { 
     setTimeout(function(){ 
      var delayed = f.apply(this, arguments); 
      return delayed; 
     }, ms); 
    } 
} 

var f1000 = delay(f, 1000); 
var f1500 = delay(f, 1500); 

f1000("test"); // must display "test" 
f1500("test2"); // must display "test2" 

답변

4

arguments을 잘못 전달했습니다.

당신은 the arguments object is a local variable 때문에 undefined을 얻고있다.
setTimeout에 전달 된 콜백 함수는 따라서 당신이 undefined를 얻을 인수가 없습니다.

당신은 닫을 수 있습니다 (closure) 외부 범위에서 arguments 이상과에 전달할 : 자네 말이 맞아 savig_b.g @

function f(x) { 
 
    console.log(x); 
 
} 
 

 
function delay(f, ms) { 
 
    return function() { 
 
    var args = arguments; 
 
    setTimeout(function() { 
 
     var delayed = f.apply(this, args); 
 
     return delayed; 
 
    }, ms); 
 
    } 
 
} 
 

 
var f1000 = delay(f, 1000); 
 
var f1500 = delay(f, 1500); 
 

 
f1000("test"); // 
 
f1500("test2"); //

+0

! 그러나 저는 왜 우리가 타이머에 직접 인수를 푸시 할 수 없는지 이해하지 못합니까? [은'arguments' 객체가 로컬 변수이다] 때문이다 감사 –

+1

(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments). 'setTimeout'에 전달 된 콜백 함수는 인자가 없기 때문에 undefined가됩니다. 바깥 쪽 범위'arguments'를 잡는 한 가지 방법은 클로저를 사용하는 것입니다 (예에서와 같이). 나는 이것을 설명하기 위해 나의 대답을 업데이트했다. –

+0

설명 해 주셔서 감사합니다. 클로저 함수에서 더 많은 연습이 필요합니다 :) –