JavaScript Syntax는 유연하며 동일한 기능에 대한 5-6 개의 구현 방법을 가지고있는 것은 드문 일이 아닙니다. 나는 종종 전화와 신청의 차이점을 이해하지 못하므로 다시 잊어 버리지 않도록 기록 할 것입니다.
JavaScript에서 방법은 다음과 같은 방식으로 실행할 수 있습니다.
1.func ()은 가장 직접적이고 일반적인 전화 방법이며, 일반인의 사고 논리에도 부합하지만 경우에 따라 몇 가지 단점이 있으며 아래에 설명됩니다.
2. (Arg) {}) (Window)는 익명 메소드 호출이 네임 스페이스를 구성 할 때 더 유용합니다.
3.func.bind (STH) (). Mozilla Manual은 ECMA-262 5th Edition에 추가 된 새로운 기능입니다.
4.func.call (), 각 메소드는 프로토 타입에 정의 된 호출 방법이 있습니다.
5.func.apply (), 전화의 쌍둥이 형제.
func ()
이것은 가장 일반적인 전화 방법이며 모든 언어 어디에서나 볼 수 있습니다. func (x, y)는 다른 매개 변수로 전달할 수 있습니다. PHP, Java와 같은 일부 언어에서는 이러한 종류의 전화로 모든 문제를 해결하기에 충분합니다. 그러나 JavaScript는 기능적 언어이며, 폐쇄의 개념과 이상한 키워드는 이러한 호출 방식의 단점을 결정합니다. 이것은 현재 코드 세그먼트의 범위로 해석되어야합니다. 그러나 코드가 다른 조각으로 실행될 때 변경됩니다. 일부 경우 특정 DOM에 묶여있는 이벤트와 같은 이벤트가 변경되기를 원합니다.
코드 사본은 다음과 같습니다.
var a = {};
var func = function (x) {
Console.log (this);
};
a.onclick = function () {
var x = 100;
func (x);
};
a.onclick ();
정의 된 메소드를 즉시 호출하는 대신 onclick 이벤트에 바인딩하려면 페이지의 링크로 생각할 수 있습니다.이 메소드에는 매개 변수가 있습니다. 이것은 문제가 있습니다. func에서 이것은 글로벌 객체 창이됩니다. 분명히 우리는 이것을 원하지 않습니다. 이 시점에서 func ()를 직접 호출 방법으로 사용하는 것은 불가능하므로 func 외부에서 func 메소드에 바인딩해야합니다. 따라서 바인드, 호출, 적용 방법이 있습니다.
묶다
Bind의 목적은 매우 간단 하여이 객체를 바인딩하는 것과 동일한 방법을 반환합니다. 위의 코드는 한 줄을 수정하여 객체에이를 바인딩하는 목적을 달성 할 수 있습니다.
코드 사본은 다음과 같습니다.
var a = {};
var func = function (x) {
Console.log (this);
};
a.onclick = function () {
var x = 100;
func.bind (this) (x);
};
a.onclick ();
이런 식으로,이 Onclick 이벤트는 헤드리스 비행처럼 돌아 다니지 않습니다.
전화 및 신청
전화와 신청은 너무 비슷하기 때문에 함께 이야기해야합니다. 모두 여러 매개 변수를 지원하고 첫 번째 매개 변수는이 객체에 바인딩되며 두 번째 매개 변수는 독립 매개 변수를 호출 매개 변수로 사용합니다. 때때로 우리는이 객체를 바꾸고 싶지 않지만 현재 다른 객체에 인위적으로 묶는 것이 매우 유용합니다. (Bind를 사용할 수는 없지만 Bind가 늦게 나타나는 것처럼 보이므로 브라우저 호환성이 좋지 않을 수 있습니다). 밤나무를 가져 가십시오 :
코드 사본은 다음과 같습니다.
a = {
func : function () {
this.x += 1;
},
x : 0
};
b = {
A : A,
x : 20
};
for (var i = 0; i <10; i ++) {
bafunc ();
}
Console.log (AX);
Console.log (BX);
위의 A 및 B 객체에 x가 대상 X를 대상으로 수정할 수 있기를 바랍니다. BX 수정 목적을 달성하기 위해 코드 수정
코드 사본은 다음과 같습니다.
a = {
func : function () {
this.x += 1;
},
x : 0
};
b = {
A : A,
x : 20
};
for (var i = 0; i <10; i ++) {
bafunc.call (b);
}
Console.log (AX);
Console.log (BX);
이 밤은 잘 알려지지 않았으며, 적용 가능한 시나리오와 함께 매우 혼란스러운 코드 스타일이지만 어디에서나 사용할 수 없습니다.