나는'm 책을 읽고 쓰기에 대한 JavaScript 프레임워크 및 이 코드. 하지만 나는't 이 어떻게 작동하는지 이해하는,특히`할 수 있습니다.바인드의 사용법? 지 단서가?
var bind = Function.prototype.bind;
var apply = bind.bind(bind.apply);
var fn = apply([].concat);
var a = [1, 2, 3], b = [4, [5, 6], 7];
fn(a, b);
//output [1, 2, 3, 4, 5, 6, 7]
이것은 나에게 다시 일을 해결하고 확장하는 답변을 받으실 수 있습니다.
1. 첫째,할 수 있습 확장 최초 적용 기능:
var bind = Function.prototype.bind;
var apply = bind.bind(bind.apply);
var fn = apply([].concat);
변환하기:
var apply = Function.prototype.bind.bind(Function.prototype.bind.apply);
var fn = apply([].concat)
2. 둘째,우리는 확장 fn 기능:
var fn = Function.prototype.bind.bind(Function.prototype.bind.apply)([].concat);
3. 지금 우리가 발명하 js 대수 규칙 및 교체할 수 있습니다.딩...()
호출 전화 호출을 기반으로 합니다.
실제로 우리를 구현하는 대체 기본 개념에는:
someFunction.bind(arg1)(arg2) <==> someFunction.call(arg1, arg2)
따라서 우리는 우리를 대체할 수 있는 것을 얻을:
var fn = Function.prototype.bind.call(Function.prototype.bind.apply, [].concat);
4. 에 대한 우리의 두 번째 js 대수 규칙 우리는 우리 고안된:
someFn.할 수 있습니다.전화(대상,...)<==>대상입니다.bind(...)
.
someFn
중요하지 않기 때문에 여기서 우리는't call bind()니다. 우리는 불러오는호출
에바인드
-교체이
는someFn
그리고 그 때문에 그것은 대체로대상
.
따라서 우리는 우리를 교체할 수 있습니다.전화(대상)
가 대상입니다.바인드체
var fn = Function.prototype.bind.apply.bind([].concat)
5. 는 경우 마지막 순열하고 있었 호출()우리가 할 수 있는 대체처:
fn([1, 2], [3, 4]) <==> [].concat.apply([1, 2], [3, 4])
하지만 우리는 바인딩지 않고 호출할 수 있는 대체하고 해당합니다:
var fn = function (arg1, arg2) {
return [].concat.apply(arg1, arg2);
}
// instead arg1 and arg2 we could use more accurate arguments logic also.
최종 결과
var fn = Function.prototype.bind.apply.bind([].concat)
// or
var fn = function (arg1, arg2) {
return [].concat.apply(arg1, arg2);
}
는fn
기능은concat
기능고 있습니다 우리는 우리에 기능적인 스타일 호출하지 않고,그로부터 개체입니다. 대신에concat
바인딩하여이
의자fn
적용에arg1
을이
와arg2 로는
다른 파라미터를 연결하는arg1
.
fn([1, 2], [3, [5, 6], 4])
// [1, 2, 3, 5, 6, 4]
기 때문에기능이 있습니다.프로토 타입입니다.딩
은 그 자체가 기능,그것을 상속받는 자체적으로 방법입니다.
일반적으로 바인드가 호출로 인스턴스 메서드의 특정한 기능,그러나 우리는 다시 바인딩 할 수 있습을`기능이 있습니다.프로토 타입입니다.적용 반환하는 높은 기능입니다.
적은 간결한 방법으로 이 글을 쓰는 것:
function apply (fn) {
return function (a, b) {
return fn.apply(a, b)
}
}
우리가 생각하는 것에 대해 조금바인딩
실제로는 않습니다. 를 대략적으로,그것은 다음과 같이 작동합니다:
function bind(fn, ...bound) {
return (...other) => this.call(fn, ...bound, ...other);
}
(을 기억하는 어휘이
말하는 기능에는바인드
라고 합니다.) 그래서 복용
apply = bind.bind(bind.apply);
과 수동으로 확장하는바인딩
자신을,우리를 얻을:
apply = (...other) => bind.call(bind.apply, ...other);
우리는'다시 전달에만 관심이 있는 단 하나는 요청에 아무 영향을 미치지 않는 함수이다. 희망이 이것은 또한 그것의 적용을 제공하는 것과 동일의바인딩
:
apply = (fn) => bind.call(fn.apply, fn);
하지만바인딩
이(가)자체에 또한`fn.적용's prototype,그래서 우리는 우리를 단순화할 수 있습 추가하기:
apply = (fn) => fn.apply.bind(fn);
우리는'시에 지금의 위치를 확장하는바인딩
다시:
apply = (fn) => (...other) => fn.apply.call(fn, ...other);
이번에 우리가 원하는 두 개의 인수,그리고 전화를호출
할 수 있도 간체:
apply = (fn) => (obj, args) => fn.apply(obj, args);
우리는'다시 지금 위치에서 호출에적용
on[].concat
:
fn = (obj, args) => [].concat.apply(obj, args);
obj
해야에 대한 배열이 작동하므로,이를 단순화하기:
fn = (obj, args) => obj.concat(...args);
고에서 제공되는 예를 들어 우리는 끝나
[1, 2, 3].concat(4, [5, 6], 7)
를 반환하는 예상된 결과입니다.
bind()
방법의 새 인스턴스를 만듭니다 기능을 전달된 값으로bind()
.
여기서 우리는기능이 있습니다.프로토 타입입니다.할 수 있습니다.적용(Function.prototype,[null].concat(인자));
을 파괴하여 별도의 실행 가능한 코드 단위입니다.
목표 전화 적용;을 통과하는 본래의 기능으로 첫 번째 매개 변수와 그 배열의 인수입니다.
이 코드는 다양한 변수를 위해 각 프로세스의 참여를 달성하는 바인딩을 가진 동적 params.
var bind=Function.prototype.bind;
// the bind function is assigned to a var
var apply=bind.bind(bind.apply);
// a new function apply is created which is nothing but bind.apply
var fn=apply([].concat);
// the apply function is defined and now we have final function
that will concat array.
마지막 두 줄을 실행하기 위한fn
기능으로 전달하는 두 개의 매개변수
var a=[1,2,3],b=[4,[5,6],7]; fn(a,b);