JavaScript에서는이 포인팅이 동적으로 변경되었으며 프로그램 작성 과정 에서이 포인팅이 실수로 파괴 될 가능성이 높습니다. 따라서, 우리는 이것의 의미를 고정시킬 수있는 기술이 필요하므로, 기능은 "정의 컨텍스트", "런타임 컨텍스트"및 "컨텍스트가 변경 될 수있는"의 개념이 있기 때문에 기능 본문 내부의 포인팅을 변경하기 위해 Call, Apply 및 Bind를 변경하기 위해 세 가지 방법이 필요합니다.
신청, 전화하십시오
적용 : 특정 객체의 하나의 메소드를 적용하고 현재 객체를 다른 객체로 바꾸십시오.
전화 : 현재 객체를 다른 객체로 바꾸려면 객체의 메소드를 호출하십시오.
function person () {} person.prototype = {attr : {age : 18, sex : 'girl'}, say : function () {console.log ( "내 나이는" + this.attr.age); console.log ( "나는" + this.attr.sex); }} var 결혼 = new Person (); red.say (); // 내 나이는 18 세입니다. // 나는 소녀입니다방향을 변경하십시오
function person () {} person.prototype = {attr : {age : 18, sex : 'girl'}, say : function () {console.log ( "내 나이는" + this.attr.age); console.log ( "나는" + this.attr.sex); }} xiaoming = {attr : {age : 20, sex : 'boy'}}; var red = new person (); red.say (); rating.say.call (Xiaoming); // 내 나이는 18 세입니다.일반적인 것
둘 다 다른 객체 대신 메소드를 호출하는 데 사용될 수 있으며, 기능의 객체 컨텍스트를 초기 컨텍스트에서 thisobj가 지정한 새 개체로 변경합니다.
차이
1. 적용 : 최대 두 개의 매개 변수 만있을 수 있습니다. 새로운이 개체와 배열 Argarray. 이 메소드에 여러 매개 변수를 전달하면 모든 매개 변수를이 배열에 작성하십시오. 물론 매개 변수가 하나만 있더라도 배열에 기록되어야합니다. Argarray가 유효한 배열이 아니거나 인수 객체가 아닌 경우 TypeError가 생성됩니다. 인수가 제공되지 않으면 글로벌 객체는 thisobj로 사용되며 인수를 전달할 수 없습니다.
fun.call (thisarg [, arg1 [, arg2 [, ...]]) function f (x, y) {console.log (x+y);} f.call (null, 1, 1) // return 22. 전화 : 직접 매개 변수 목록으로, 주로 JS 객체의 다양한 메소드가 서로 호출 될 때 주로 사용되므로 현재 포인터가 일관성이 유지되거나 특수한 경우이 포인터를 변경해야합니다. thisobj 매개 변수가 제공되지 않으면 글로벌 객체는 thisobj로 사용됩니다.
fun.apply (thisarg, [argsarray]) 함수 f (x, y) {console.log (x+y);} f.call (null, [1,1]) // return 2적용은 들어오는 매개 변수 목록이 양식이 다르다는 점을 제외하고는 통화 함수와 동일합니다. Thisarg는 당신이 지정하려는 컨텍스트입니다. JavaScript 객체 일 수 있습니다 (JavaScript의 모든 것은 객체입니다). 호출은 순서대로 매개 변수를 전달해야하며, 적용은 배열에 매개 변수를 넣습니다.
함수의 매개 변수 수가 고정되지 않은 경우, 매개 변수가 수량을 명확하게 알면 호출을 사용하고 불확실 할 때 적용한 다음 매개 변수를 배열로 푸시하여 전달하십시오. 매개 변수 수가 불확실한 경우 기능은 인수 배열을 통해 모든 매개 변수를 통과 할 수 있습니다. 사용법을 살펴 보겠습니다
코드 1
var array1 = [12, "foo", {name : "joe"}, -2458]; var array2 = [ "doe", 555, 100]; array.prototyp.push.apply (array1, array2); console.log (array1); // "12,"foo ", 객체, -2458,", 555, 100]코드 2
var numbers = [5, 458, 120, -215]; Math.max.apply (null, 숫자); // 458
코드 3
log (12, "foo", {name : "joe"}, -2458); function log () {var args = array.prototype.slice.call (arguments); args.unshift ( '(app)'); console.log.apply (콘솔, args);}; // (app) 12 foo Object {name : "joe"} -2458묶다
fun.bind (thisarg [, arg1 [, arg2 [, ...]]]))))
위의 것과 달리 BIND는이 포인팅을 변경하는 새로운 기능을 반환합니다. 새로운 기능은 여기에서 강조되는데,이 기능은 이전에 사용한 것과 동일한 메모리 주소가 아니므 로이 기능을 재사용해야 할 때 다음 호출을 용이하게하려면 변수에 저장해야합니다. 위의 두 기능은 반환 된 실행 결과, 즉 호출이 실행됩니다.
또한 BAND 함수의 첫 번째 매개 변수는 새 함수에서 매개 변수를 반환하기위한 기본값이 자동으로된다는 점에 주목해야 할 또 다른 사항이 있습니다. 그런 다음 공식 호출이 호출되면 첫 번째 매개 변수를 제외한 나머지 매개 변수 만 제공하면됩니다.
함수 f (x, y) {console.log (x+y);} f.call (null, [1,1]) var new_f = f.bind (null, 1,1) // 새로운 functionnew_f (1) // 반환 2위의 모든 예제 코드 의이 ARG 매개 변수는 NULL로 대체됩니다. 이 ARG 객체가 지정되지 않은 경우,이 포인팅은 NULL의 전역 객체입니다. 즉, JS 코드 실행 환경
적용, 전화, 바인딩 비교
var obj = {bar : 'oops, 이것은 나쁜 생각입니다'}; var foo = {get : function () {return this.bar; }} var bind = foo.get.bind (obj), call = foo.get.call (obj), apply = foo.get.apply (obj); console.log (bind (), call, apply); Console.log (바인드, 호출, 적용); console.log (typeof bind, typeof call, typeof apply); console.log (typeof bind (), typeof call, typeof apply);나는 차이가 없다. 차이점은 컨텍스트를 변경하려면 즉시 실행되지 않지만 콜백이 실행되면 BIND () 메소드를 사용한다는 것입니다. 적용/통화는 즉시 함수를 실행합니다
적용, 호출, 바인드는 모두 함수 의이 객체의 포인팅을 변경하는 데 사용됩니다. Apply, Call, Bind의 첫 번째 매개 변수는 이것이 지적 해야하는 모든 객체, 즉 지정 될 컨텍스트입니다. 적용, 호출, 바인드는 모두 후속 매개 변수를 사용하여 매개 변수를 전달할 수 있습니다. Bind는 해당 기능을 반환하며 나중에 호출하기에 편리합니다. 신청, 전화는 즉시 호출됩니다
위의 기사는 JavaScript의 통화, 적용 및 바인딩 메소드의 차이점을 깊이 이해합니다. 나는 그것이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.