Michael Bolin의 Closure : The Definitive Guide 에서 발췌 한 내용 입니다. 약간 길어 보일 수 있지만 통찰력이 풍부합니다. "부록 B. 자주 JavaScript 개념을 오해":
어떤 this
함수가 호출되는 경우를 말합니다
형식의 함수를 호출 할 때 foo.bar.baz()
객체를 foo.bar
수신자라고합니다. 함수가 호출되면 다음 값으로 사용되는 수신자입니다 this
.
var obj = {};
obj.value = 10;
/** @param {...number} additionalValues */
obj.addValues = function(additionalValues) {
for (var i = 0; i < arguments.length; i++) {
this.value += arguments[i];
}
return this.value;
};
// Evaluates to 30 because obj is used as the value for 'this' when
// obj.addValues() is called, so obj.value becomes 10 + 20.
obj.addValues(20);
함수가 호출 될 때 명시적인 수신자가 없으면 전역 오브젝트가 수신자가됩니다. 47 페이지의 "goog.global"에서 설명한대로 window는 웹 브라우저에서 JavaScript가 실행될 때 전역 객체입니다. 이것은 놀라운 행동으로 이어진다 :
var f = obj.addValues;
// Evaluates to NaN because window is used as the value for 'this' when
// f() is called. Because and window.value is undefined, adding a number to
// it results in NaN.
f(20);
// This also has the unintentional side effect of adding a value to window:
alert(window.value); // Alerts NaN
비록 obj.addValues
와 f
동일한 기능을 참조하십시오, 그들은 수신기의 값이 각 통화에서 다르기 때문에 전화했을 때 다르게 동작합니다. 따라서을 참조하는 함수를 호출 할 때 호출 될 때 올바른 값 this
을 갖도록하는 것이 중요합니다 this
. 명확하게 말하면 this
함수 본문에서 참조되지 않은 경우 동작 f(20)
과 obj.addValues(20)
동일합니다.
함수는 JavaScript에서 일류 객체이므로 자체 메서드를 가질 수 있습니다. 모든 함수에는 메소드가 call()
있으며 함수를 호출 할 때 apply()
수신자 (즉, 참조하는 오브젝트)를 재정의 할 수 this
있습니다. 메소드 서명은 다음과 같습니다.
/**
* @param {*=} receiver to substitute for 'this'
* @param {...} parameters to use as arguments to the function
*/
Function.prototype.call;
/**
* @param {*=} receiver to substitute for 'this'
* @param {Array} parameters to use as arguments to the function
*/
Function.prototype.apply;
참고 유일한 차이 call()
및 apply()
그 인 call()
반면, 각각의 인자로서의 기능 파라미터를 수신하는 apply()
단일 어레이로 수신 :
// When f is called with obj as its receiver, it behaves the same as calling
// obj.addValues(). Both of the following increase obj.value by 60:
f.call(obj, 10, 20, 30);
f.apply(obj, [10, 20, 30]);
로 다음의 호출은, 동등 f
하고 obj.addValues
동일한 기능을 참조하십시오
obj.addValues.call(obj, 10, 20, 30);
obj.addValues.apply(obj, [10, 20, 30]);
그러나 수신자 인수가 지정되지 않은 경우 수신자 인수를 대체하기 위해 자체 수신자의 값을 사용 call()
하거나 apply()
사용 하지 않기 때문에 다음이 작동하지 않습니다.
// Both statements evaluate to NaN
obj.addValues.call(undefined, 10, 20, 30);
obj.addValues.apply(undefined, [10, 20, 30]);
의 값은 this
절대 null
또는 undefined
함수가 호출 될 수 없습니다 . 경우 null
또는 undefined
받는 수신기로 공급된다 call()
또는 apply()
전역 객체 대신에 수신기에 대한 값으로서 사용된다. 따라서 앞의 코드는 value
전역 개체에 이름이 지정된 속성을 추가 할 때와 동일한 바람직하지 않은 부작용이 있습니다.
함수가 할당 된 변수에 대한 지식이없는 것으로 생각하면 도움이 될 수 있습니다. 이는 함수가 정의 될 때가 아니라 함수가 호출 될 때이 값이 바인드 될 것이라는 아이디어를 강화하는 데 도움이됩니다.
추출물의 끝.
a
배열을 적용하고 arg의c
열을 요구하는 것을 생각하십시오 .