[javascript] 올바른 "this"컨텍스트를 setTimeout 콜백에 전달 하시겠습니까?


Answers

@CMS가 응답 한 함수 래퍼에 기성의 단축키 (구문 설탕)가 있습니다. (원하는 컨텍스트가 this.tip 이라고 가정 할 때 아래)

ECMAScript 5 ( 현재 브라우저 , Node.js) 및 Prototype.js

ECMA-262, 5th edition (ECMAScript 5) 또는 Node.js 와 호환되는 브라우저 를 타겟팅하는 경우 Function.prototype.bind 사용할 수 있습니다. 선택적으로 함수 인수를 전달하여 부분 함수 를 작성할 수 있습니다 .

fun.bind(thisArg[, arg1[, arg2[, ...]]])

다시 말하지만, 귀하의 경우 다음을 시도하십시오.

if (this.options.destroyOnHide) {
    setTimeout(this.tip.destroy.bind(this.tip), 1000);
}

동일한 기능이 Prototype (다른 라이브러리?)에서도 구현 되었습니다.

Function.prototype.bind 사용자 정의 하위 호환성을 원한다면 이렇게 구현 될 수 있습니다 (단,주의 사항을 준수하십시오).

ECMAScript 2015 ( 일부 브라우저 , Node.js 5.0.0 이상)

첨단 개발 (2015)을 위해 ECMAScript 2015 (하모니 / ES6 / ES2015) 사양 ( examples )의 일부인 팻 화살표 기능을 사용할 수 있습니다.

화살표 함수 식 ( 굵은 화살표 함수 라고도 함)은 함수 식과 비교하여 구문이 짧으며이 값 [...]을 어휘 적으로 바인딩합니다.

(param1, param2, ...rest) => { statements }

귀하의 경우 다음을 시도하십시오.

if (this.options.destroyOnHide) {
    setTimeout(() => { this.tip.destroy(); }, 1000);
}

jQuery

이미 jQuery 1.4+를 사용하고 있다면이 함수의 컨텍스트를 명시 적으로 설정하기위한 기성 함수가 있습니다.

jQuery.proxy() : 함수를 가져 jQuery.proxy() 항상 특정 컨텍스트를 갖는 새 함수를 반환합니다.

$.proxy(function, context[, additionalArguments])

귀하의 경우 다음을 시도하십시오.

if (this.options.destroyOnHide) {
    setTimeout($.proxy(this.tip.destroy, this.tip), 1000);
}

Underscore.js , lodash

Underscore.js에서 사용할 수 있으며 lodash는 _.bind(...) 1 , 2

1 함수를 객체에 1 합니다. 즉, 함수가 호출 될 때마다 thisthis 객체가됩니다. 선택적으로 인수를 함수에 바인딩하여 함수에 미리 채우거나 부분 응용 프로그램이라고도합니다.

_.bind(function, object, [*arguments])

귀하의 경우 다음을 시도하십시오.

if (this.options.destroyOnHide) {
    setTimeout(_.bind(this.tip.destroy, this.tip), 1000);
}

bind jquery underscore.js ecmascript-5 prototypejs node.js

Question

이 질문에는 이미 답변이 있습니다.

컨텍스트를 setTimeout 전달하는 방법은 무엇입니까? this.tip.destroy()this.options.destroyOnHide 후에 this.tip.destroy() 를 호출하려고합니다. 어떻게해야합니까?

if (this.options.destroyOnHide) {
     setTimeout(function() { this.tip.destroy() }, 1000);
} 

위의 내용을 시도하면 창을 나타냅니다.




Underscore.js 을 사용 bind 경우 bind 를 사용할 수 있습니다.

예 :

if (this.options.destroyOnHide) {
     setTimeout(_.bind(this.tip.destroy, this), 1000);
}



Related