이 컨텍스트를 함수에 어떻게 전달합니까?


213

나는 이것이 쉽게 구글 일 수있는 것이라고 생각했지만 아마도 올바른 질문을하지 않을 수도 있습니다 ...

주어진 자바 스크립트 함수에서 "this"가 참조하는 것을 어떻게 설정합니까?

예를 들어, 다음과 같은 대부분의 jQuery 기능과 마찬가지로 :

$(selector).each(function() {
   //$(this) gives me access to whatever selector we're on
});

호출 할 때 적절한 "this"참조가있는 자체 독립형 함수를 작성 / 호출하는 방법은 무엇입니까? jQuery를 사용하므로 jQuery 고유의 방법으로 수행하는 것이 이상적입니다.



나는이 오래된 질문 알아요,하지만 여기에 착륙 다른 사람을 위해 jQuery를 참조$.proxy
RyBolt

답변:


303

자바 스크립트 .call().apply()메소드를 사용하면 함수 의 컨텍스트 를 설정할 수 있습니다 .

var myfunc = function(){
    alert(this.name);
};

var obj_a = {
    name:  "FOO"
};

var obj_b = {
    name:  "BAR!!"
};

이제 전화를 걸 수 있습니다 :

myfunc.call(obj_a);

어떤 경고 FOO합니다. 다른 방법으로지나 obj_b가면 경고 BAR!!합니다. 의 차이 .call()와는 .apply().call()당신이 함수에 인수를 전달하는 경우 쉼표로 구분 된 목록 소요 .apply()배열을 필요로한다.

myfunc.call(obj_a, 1, 2, 3);
myfunc.apply(obj_a, [1, 2, 3]);

따라서 메소드 hook를 사용하여 함수 를 쉽게 작성할 수 있습니다 apply(). 예를 들어, jQuerys .css()메소드에 기능을 추가하려고합니다 . 원래 함수 참조를 저장하고, 사용자 정의 코드로 함수를 덮어 쓰고 저장된 함수를 호출 할 수 있습니다.

var _css = $.fn.css;
$.fn.css = function(){
   alert('hooked!');
   _css.apply(this, arguments);
};

매직 arguments객체는 객체와 같은 배열 이므로 그냥 전달할 수 있습니다 apply(). 그렇게하면 모든 매개 변수가 원래 함수로 전달됩니다.


4
재미있는 재미있는 내용 : obj_a예를 들어 를 참조하여 함수를 반복적으로 호출 해야하는 경우 함수 사본을 만들고 필요에 따라 var boud_myfunc = myfunc.bind(obj_a)간단히 호출 bound_myfunc()할 수 있습니다.
wbadart

44

사용function.call :

var f = function () { console.log(this); }
f.call(that, arg1, arg2, etc);

함수에서 that원하는 객체는 어디에 있습니까 this?


1
function예약 키워드입니다. function.call(...)JavaScript가 유효하지 않으므로 명명 된 함수를 포함하도록 응답을 업데이트하십시오 .
Daniel Allen

1
@DanielAllen : 내가 제공 할 샘플 함수 이름을 정의하지 않으면 코드에 여전히 JS 오류가 발생합니다. 그러나 샘플 함수 이름을 업데이트했습니다.
palswim

16

jQuery는 .call(...)메소드를 사용 this하여 매개 변수로 전달한 함수 내부에 현재 노드를 지정합니다 .

편집하다:

의심 스러울 때 jQuery의 코드를 들여다 보는 것을 두려워하지 마십시오. 모두 명확하고 잘 문서화 된 Javascript입니다.

즉,이 질문에 대한 답은 574 행입니다.
callback.call( object[ name ], name, object[ name ] ) === false


12

바인드 함수를 사용하여 함수 this내 에서 컨텍스트를 설정할 수 있습니다 .

function myFunc() {
  console.log(this.str)
}
const myContext = {str: "my context"}
const boundFunc = myFunc.bind(myContext);
boundFunc(); // "my context"

12

또 다른 기본 예 :

작동하지 않는:

var img = new Image;
img.onload = function() {
   this.myGlobalFunction(img);
};
img.src = reader.result;

일:

var img = new Image;
img.onload = function() {
   this.myGlobalFunction(img);
}.bind(this);
img.src = reader.result;

기본적으로 함수에 .bind (this)를 추가하십시오.


이것이 정답입니다. 훨씬 쉬운 구문, 마음에 훨씬 쉽게 ... 좋은 직업 Joery
nenea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.