2013-08-28 1 views
1
내가 map 같은 일부 ES5의 배열 추가 방법을 사용하려고

, some, forEach혼란 ES5의 배열에 대한 별도의 방법 '컨텍스트

[1, 2, 3].forEach(function (el) { 
    console.log(this) // window 
}) 

하지만 이러한 방법의 컨텍스트가 배열이 아닌 발견하는

그러나 Global contextwindow과 같습니다. 에서는

MDN의 opinion

함수를 객체의 방법이라 할 때, 그 행이 메소드가 호출되는 객체를 설정한다.

그럼 배열과 호출 된 메서드 사이의 관계는 무엇입니까? 당신이 on the developer.mozilla.org을 보면

+0

익명 콜백 함수는'Array'의 메소드가 아니며 forEach()는 is입니다. – millimoose

답변

1

당신은 forEach의 서명 인 것을 볼 수 있습니다 :

array.forEach (콜백 [thisArg])

다음

하는 경우 thisArg 매개 변수가 forEach에 제공되면 callback.call (thisArg, element, index, array)이 호출 된 것처럼 각 콜백 호출에 대해이 값으로 사용됩니다. thisArg가 정의되지 않았거나 null 인 경우 함수 내의이 값은 함수가 엄격 모드에 있는지 여부 (엄격 모드에서는 전달 된 값, 비 엄격 모드에서는 전역 객체)에 따라 다릅니다. 당신이 forEach의 두 번째 인수로 넣어하지 않는

그래서 혹시 arraythis로를받을 수 없습니다.

1

this 대해 forEach은이 방법 forEach 내부 라고하는 배열로 설정되어있다. 그러나 forEach 메서드에 전달하는 익명의 함수는 해당 배열의 메서드로 호출되지 않기 때문에 this이 배열로 설정되지 않습니다. (하지만 당신은 thisArgforEach 방법으로 배열을 제공하므로 this를 익명 함수에 배열을 가리 것이다

예 수 :.

var a = [1, 2, 3]; 
a.forEach(function (el) { 
    console.log(this) // the Array 
}, a); 

또는 기능 결합 :

var a = [1, 2, 3]; 
a.forEach((function (el) { 
    console.log(this) // the Array 
}).bind(a));