2016-10-06 3 views
0

무료 코드 캠프의 연습 "Seek and Destroy"을 진행하고 있습니다. 배열 인 첫 번째 인수 뒤의 인수는 배열에서 필터링해야합니다. JS 빈에하위 함수의 arguments 객체 (크롬 콘솔에서 작동하지만 다른 곳에서는 작동하지 않음)

function destroyer(arr) { 

    return arr.filter(function(x){ 
    for(var i = 1; i < destroyer.arguments.length; i++){ 
     if(x == destroyer.arguments[i]) {return false;} 
    } 
    return true; 
    }); 

} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); //should return [1, 1] 

하고 그대로 아무것도하지 않는 다른 장소 :

나는이 크롬 콘솔에서 작동 코드를 함께했다. 오직 return 대신 새로운 배열로 console.log를 사용하는 경우에만 작동합니다. 무료 코드 캠프에서 실행하면 다음과 같은 메시지가 나타납니다.

TypeError: 'caller' and 'arguments' are restricted function properties and cannot be accessed in this context.

나는 엄격 모드와 관련이 있다는 사실을 발견했습니다. 그러나 그것이 실제로 의미하는 것은 무엇입니까? 부모 함수의 arguments 객체를 하위 함수 내에서 사용할 수 없다는 말입니까?

인수를 먼저 배열로 변환 한 다음 해당 배열을 하위 함수로 사용하면 어디에서나 사용할 수 있습니다. 그러나 나는 왜 자식 함수에서 인수가 크롬 콘솔에서 작동하지만 다른 곳에서는 작동하지 않는지, 그리고 자식 함수에서 인수 객체를 사용하는 방법이 있는지 궁금합니다.

+0

콘솔에서 작동하는 이유에 대한 질문에 대답하지 않지만 내부 함수를 ES6 화살표 함수로 만들면 외부 함수 인'https : // jsfiddle '의'arguments' 객체에 액세스 할 수 있습니다. net/aa66x552 /, ES6 구문을 사용하려고한다면 rest 매개 변수 대신 https://jsfiddle.net/aa66x552/1/를 사용하여'arguments '를 피할 수 있습니다. 또는'function destroyer (arr, ... vals) {return arr.filter (x => vals.indexOf (x) === -1); }'. – nnnnnn

답변

0

Strict mode은 사용하지 않아야하는 많은 기능이 허용되지 않는 특수 모드의 JavaScript입니다. 이 기능 중 destroyer.arguments과 같이 arguments 또는 caller 함수의 속성에 액세스하는 것이므로 엄격 모드에서이 작업을 수행하려고하면 오류가 발생합니다.

대신, 외부 기능에 특별한 변수로 arguments 액세스하고 변수에 할당한다 : 기본적으로 엄격 모드가 아니라고

// use strict mode 
 
"use strict"; 
 

 
function destroyer(arr) { 
 
    // assign arguments to a variable that can be accessed by the inner 
 
    // function 
 
    var destroyerArguments = arguments; 
 

 
    return arr.filter(function(x){ 
 
    // use destroyerArguments instead of destroyer.arguments 
 
    for(var i = 1; i < destroyerArguments.length; i++){ 
 
     if(x == destroyerArguments[i]) {return false;} 
 
    } 
 
    return true; 
 
    }); 
 
} 
 

 
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3)); // prints [ 1, 1 ]

주 Chrome의 콘솔에서 코드를 실행할 때 이러한 기능은 허용되지 않습니다. 그러나 무료 코드 캠프는 자동으로 엄격 모드를 사용하므로 코드를 적절하게 설계해야합니다. 위 코드에서 수행 한 것처럼

"use strict"; 

행을 함수 또는 파일의 맨 위에 추가하여 엄격 모드를 사용하도록 설정할 수 있습니다.

+0

나는 이것도 실제로했다. 내적 기능 안에서 논증에 접근하는 것이 어쨌든 가능한지를 알아 내려고했습니다. 가능한 이유는 destroyer.arguments를 사용하면 인수가 파괴자의 속성이된다는 것을 의미하기 때문입니다. – slacle

+0

@slacle 함수에 정의 된'arguments' 함수가 * 있습니다. 그냥 (권장하지 않음) (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/arguments) 사용하지 않는 것이 좋습니다. 따라서 사용을 허용하지 않습니다. 엄격 모드에서. 위 예제에서와 같이 외부 함수의 변수를 선언하는 것은 외부 함수의 인수에 액세스하려는 경우 수행해야하는 방법입니다. – Frxstrem

관련 문제