2011-12-01 4 views
4

Array.forEach 함수를 사용해야하는 최신 웹 응용 프로그램에서 작업 할 때 나는 내장 된 함수가없는 구형 브라우저에 계속해서 다음 코드를 추가했습니다.Array.prototype.forEach 대체 구현 매개 변수

/** 
* Copyright (c) Mozilla Foundation http://www.mozilla.org/ 
* This code is available under the terms of the MIT License 
*/ 
if (!Array.prototype.forEach) { 
    Array.prototype.forEach = function(fun /*, thisp*/) { 
     var len = this.length >>> 0; 
     if (typeof fun != "function") { 
      throw new TypeError(); 
     } 

     var thisp = arguments[1]; 
     for (var i = 0; i < len; i++) { 
      if (i in this) { 
       fun.call(thisp, this[i], i, this); 
      } 
     } 
    }; 
} 

나는 완전히 어떻게 작동하는지 코드가 수행하고 이해,하지만 난 항상 주석과 대신 arguments[1]을 사용하여 로컬 변수로 설정 한 공식 thisp 매개 변수를 사용하여 복사를 참조하십시오.

내가 왜 알 수 있듯이이 코드가 thisp으로 변수가 아닌 공식 매개 변수로 사용되었으므로이 변경이 이루어진 이유를 아는 사람이 있는지 궁금합니다.

답변

5

Array.prototype.forEach.length1으로 설정된 .length 속성이있는 경우 구현 기능이 더 원시 적이 될 것입니다.

http://es5.github.com/#x15.4.4.18

foreach는 방법의 길이 속성 1.

(func.lengthfunc은 그 정의에 따라 소요되는 인자의 양이다.)이다 func.length 들어

1이면 func을 정의하여 1 개의 인수 만 가져야합니다. 함수 자체에서 항상 모든 인수를 arguments으로 얻을 수 있습니다. 그러나 1 인수를 취하도록 함수를 정의하면 .length 속성은 1입니다. 따라서 사양에 따라 더 정확합니다.

+0

흠. 왜 길이가 1인지 궁금해. 두 번째 매개 변수가 선택 사항이기 때문에 그럴 것 같니? (나는 함수의 길이가 인자의 수라는 것을 결코 알지 못했다.) – Joshua

+0

@ Joshua : 아마도, 스펙이 말하는 것은 무엇이든지, 명확한 이유가 없다하더라도 그것이 정의되는 방법이다. :) – pimvdb

-1

이것은 프로토 타입 함수에 해당하는 문자열을 반복하지 않고 배열의 각 값을 반복합니다.

Array.prototype.forEach = function(fun /*, thisp*/) { 
    if (typeof fun != "function") { 
     throw new TypeError(); 
    } 

    for(i = 0; i < this.length; i++){ 
     ... 
    } 

}