Skip to content

Commit 16959ef

Browse files
committed
[충돌해결 및 번역] Part1 6.10 함수 바인딩
1 parent c437dba commit 16959ef

2 files changed

Lines changed: 31 additions & 44 deletions

File tree

1-js/06-advanced-functions/10-bind/5-question-use-bind/solution.md

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
2-
<<<<<<< HEAD
3-
에러는 `ask`가 함수 `loginOk`, `loginFail`을 객체 없이 가지고 오기 때문에 발생합니다.
4-
=======
5-
The error occurs because `askPassword` gets functions `loginOk/loginFail` without the object.
6-
>>>>>>> upstream/master
1+
에러는 `askPassword`가 함수 `loginOk`, `loginFail`을 객체 없이 가지고 오기 때문에 발생합니다.
72

83
ask는 `loginOk`, `loginFail`을 호출할 때 `this=undefined`라고 자연스레 가정합니다.
94

@@ -37,9 +32,13 @@ askPassword(user.loginOk.bind(user), user.loginFail.bind(user));
3732
이제 잘 동작합니다.
3833

3934
이 외에도 다른 답이 있는데, 아래에서 확인 가능합니다.
35+
4036
```js
4137
//...
42-
askPassword(() => user.loginOk(), () => user.loginFail());
38+
askPassword(
39+
() => user.loginOk(),
40+
() => user.loginFail(),
41+
);
4342
```
4443

4544
이렇게 화살표 함수를 사용하는 방법 또한 대개 잘 동작하며 가독성도 좋습니다.

1-js/06-advanced-functions/10-bind/article.md

Lines changed: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
libs:
2-
- lodash
2+
3+
- lodash
34

45
---
56

@@ -30,7 +31,7 @@ setTimeout(user.sayHi, 1000); // Hello, undefined!
3031

3132
`this.firstName`이 "John"이 되어야 하는데, 얼럿창엔 `undefined`가 출력됩니다.
3233

33-
이렇게 된 이유는 `setTimeout`에 객체에서 분리된 함수인 `user.sayHi`가 전달되기 때문입니다. 위 예시의 마지막 줄은 다음 코드와 같습니다.
34+
이렇게 된 이유는 `setTimeout`에 객체에서 분리된 함수인 `user.sayHi`가 전달되기 때문입니다. 위 예시의 마지막 줄은 다음 코드와 같습니다.
3435

3536
```js
3637
let f = user.sayHi;
@@ -72,19 +73,22 @@ setTimeout(() => user.sayHi(), 1000); // Hello, John!
7273

7374
`setTimeout`이 트리거 되기 전에(1초가 지나기 전에) `user`가 변경되면, 변경된 객체의 메서드를 호출하게 됩니다.
7475

75-
7676
```js run
7777
let user = {
7878
firstName: "John",
7979
sayHi() {
8080
alert(`Hello, ${this.firstName}!`);
81-
}
81+
},
8282
};
8383

8484
setTimeout(() => user.sayHi(), 1000);
8585

8686
// 1초가 지나기 전에 user의 값이 바뀜
87-
user = { sayHi() { alert("또 다른 사용자!"); } };
87+
user = {
88+
sayHi() {
89+
alert("또 다른 사용자!");
90+
},
91+
};
8892

8993
// setTimeout에 또 다른 사용자!
9094
```
@@ -104,11 +108,11 @@ let boundFunc = func.bind(context);
104108

105109
`func.bind(context)`는 함수처럼 호출 가능한 '특수 객체(exotic object)'를 반환합니다. 이 객체를 호출하면 `this``context`로 고정된 함수 `func`가 반환됩니다.
106110

107-
따라서 `boundFunc`를 호출하면 `this`가 고정된 `func`를 호출하는 것과 동일한 효과를 봅니다.
111+
따라서 `boundFunc`를 호출하면 `this`가 고정된 `func`를 호출하는 것과 동일한 효과를 봅니다.
108112

109113
아래 `funcUser`에는 `this``user`로 고정된 `func`이 할당됩니다.
110114

111-
```js run
115+
```js run
112116
let user = {
113117
firstName: "John"
114118
};
@@ -119,19 +123,15 @@ function func() {
119123

120124
*!*
121125
let funcUser = func.bind(user);
122-
funcUser(); // John
126+
funcUser(); // John
123127
*/!*
124128
```
125129

126-
<<<<<<< HEAD
127-
여기서 `func.bind(user)``func``this``user`로 '바인딩한 변형'이라고 생각하시면 됩니다.
128-
=======
129-
Here `func.bind(user)` is a "bound variant" of `func`, with fixed `this=user`.
130-
>>>>>>> upstream/master
130+
여기서 `func.bind(user)``this=user`로 고정된 `func`의 '바인딩한 변형'이라고 생각하면 됩니다.
131131

132132
인수는 원본 함수 `func`에 '그대로' 전달됩니다.
133133

134-
```js run
134+
```js run
135135
let user = {
136136
firstName: "John"
137137
};
@@ -150,7 +150,6 @@ funcUser("Hello"); // Hello, John (인수 "Hello"가 넘겨지고 this는 user
150150

151151
이제 객체 메서드에 `bind`를 적용해 봅시다.
152152

153-
154153
```js run
155154
let user = {
156155
firstName: "John",
@@ -177,50 +176,42 @@ user = {
177176

178177
`(*)`로 표시한 줄에서 메서드 `user.sayHi`를 가져오고, 메서드에 `user`를 바인딩합니다. `sayHi`는 이제 '묶인(bound)' 함수가 되어 단독으로 호출할 수 있고 `setTimeout`에 전달하여 호출할 수도 있습니다. 어떤 방식이든 컨택스트는 원하는 대로 고정됩니다.
179178

180-
아래 예시를 실행하면 인수는 '그대로' 전달되고 `bind`에 의해 `this`만 고정된 것을 확인할 수 있습니다.
179+
아래 예시를 실행하면 인수는 '그대로' 전달되고 `bind`에 의해 `this`만 고정된 것을 확인할 수 있습니다.
181180

182181
```js run
183182
let user = {
184183
firstName: "John",
185184
say(phrase) {
186185
alert(`${phrase}, ${this.firstName}!`);
187-
}
186+
},
188187
};
189188

190189
let say = user.say.bind(user);
191190

192-
<<<<<<< HEAD
193191
say("Hello"); // Hello, John (인수 "Hello"가 say로 전달되었습니다.)
194192
say("Bye"); // Bye, John ("Bye"가 say로 전달되었습니다.)
195-
=======
196-
say("Hello"); // Hello, John! ("Hello" argument is passed to say)
197-
say("Bye"); // Bye, John! ("Bye" is passed to say)
198-
>>>>>>> upstream/master
199193
```
200194

201195
````smart header="`bindAll`로 메서드 전체 바인딩하기"
202196
객체에 복수의 메서드가 있고 이 메서드 전체를 전달하려 할 땐, 반복문을 사용해 메서드를 바인딩할 수 있습니다.
203197

204198
```js
205199
for (let key in user) {
206-
if (typeof user[key] == 'function') {
200+
if (typeof user[key] == "function") {
207201
user[key] = user[key].bind(user);
208202
}
209203
}
210204
```
211205

212-
<<<<<<< HEAD
213-
자바스크립트 라이브러리를 사용해도 대규모 바인딩을 할 수 있습니다. lodash 라이브러리의 [_.bindAll(object, methodNames)](http://lodash.com/docs#bindAll)이 그 예입니다.
214-
=======
215-
JavaScript libraries also provide functions for convenient mass binding , e.g. [_.bindAll(object, methodNames)](https://lodash.com/docs#bindAll) in lodash.
216-
>>>>>>> upstream/master
206+
자바스크립트 라이브러리를 사용해도 대규모 바인딩을 할 수 있습니다. lodash 라이브러리의 [\_.bindAll(object, methodNames)](https://lodash.com/docs#bindAll)이 그 예입니다.
207+
217208
````
218209
219210
## 부분 적용
220211
221212
지금까진 `this` 바인딩에 대해서만 이야기해보았습니다. 한 단계 더 나아가 봅시다.
222213
223-
`this` 뿐만 아니라 인수도 바인딩이 가능합니다. 인수 바인딩은 잘 쓰이진 않지만 가끔 유용할 때가 있습니다.
214+
`this` 뿐만 아니라 인수도 바인딩이 가능합니다. 인수 바인딩은 잘 쓰이진 않지만 가끔 유용할 때가 있습니다.
224215
225216
`bind`의 전체 문법은 다음과 같습니다.
226217
@@ -258,11 +249,7 @@ alert( double(5) ); // = mul(2, 5) = 10
258249
259250
이런 방식을 [부분 적용(partial application)](https://en.wikipedia.org/wiki/Partial_application)이라고 부릅니다. 부분 적용을 사용하면 기존 함수의 매개변수를 고정하여 새로운 함수를 만들 수 있습니다.
260251
261-
<<<<<<< HEAD
262-
위 예시에선 `this`를 사용하지 않았다는 점에 주목하시기 바랍니다. `bind`엔 컨텍스트를 항상 넘겨줘야 하므로 `null`을 사용했습니다.
263-
=======
264-
Please note that we actually don't use `this` here. But `bind` requires it, so we must put in something like `null`.
265-
>>>>>>> upstream/master
252+
위 예시에선 `this`를 사용하지 않았다는 점에 주목하기 바랍니다. `bind`엔 컨텍스트를 항상 넘겨줘야 하므로 `null`을 사용했습니다.
266253
267254
부분 적용을 사용해 3을 곱해주는 함수 `triple`을 만들어보겠습니다.
268255
@@ -294,7 +281,7 @@ alert( triple(5) ); // = mul(3, 5) = 15
294281
295282
네이티브 `bind`만으로는 컨텍스트를 생략하고 인수로 바로 뛰어넘지 못합니다.
296283
297-
다행히도 인수만 바인딩해주는 헬퍼 함수 `partial`를 구현하는 건 쉽습니다.
284+
다행히도 인수만 바인딩해주는 헬퍼 함수 `partial`를 구현하는 건 쉽습니다.
298285
299286
아래와 같이 말이죠.
300287
@@ -336,8 +323,9 @@ lodash 라이브러리의 [_.partial](https://lodash.com/docs#partial)을 사용
336323
337324
`func.bind(context, ...args)`는 `this`가 `context`로 고정되고 인수도 고정된 함수 `func`을 반환합니다.
338325
339-
`bind`는 보통 객체 메서드의 `this`를 고정해 어딘가에 넘기고자 할 때 사용합니다. `setTimeout`에 넘길 때 같이 말이죠.
326+
`bind`는 보통 객체 메서드의 `this`를 고정해 어딘가에 넘기고자 할 때 사용합니다. `setTimeout`에 넘길 때 같이 말이죠.
340327
341328
기존 함수의 인수 몇 개를 고정한 함수를 *부분 적용(partially applied)* 함수 또는 *부분(partial)* 함수라고 부릅니다.
342329
343-
부분 적용은 같은 인수를 여러 번 반복하고 싶지 않을 때 유용합니다. `send(from, to)`라는 함수가 있는데 `from`을 고정하고 싶다면 `send(from, to)`의 부분 함수를 구현해 사용하면 됩니다.
330+
부분 적용은 같은 인수를 여러 번 반복하고 싶지 않을 때 유용합니다. `send(from, to)`라는 함수가 있는데 `from`을 고정하고 싶다면 `send(from, to)`의 부분 함수를 구현해 사용하면 됩니다.
331+
````

0 commit comments

Comments
 (0)