You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
`setTimeout`이 트리거 되기 전에(1초가 지나기 전에) `user`가 변경되면, 변경된 객체의 메서드를 호출하게 됩니다.
74
75
75
-
76
76
```js run
77
77
let user = {
78
78
firstName:"John",
79
79
sayHi() {
80
80
alert(`Hello, ${this.firstName}!`);
81
-
}
81
+
},
82
82
};
83
83
84
84
setTimeout(() =>user.sayHi(), 1000);
85
85
86
86
// 1초가 지나기 전에 user의 값이 바뀜
87
-
user = { sayHi() { alert("또 다른 사용자!"); } };
87
+
user = {
88
+
sayHi() {
89
+
alert("또 다른 사용자!");
90
+
},
91
+
};
88
92
89
93
// setTimeout에 또 다른 사용자!
90
94
```
@@ -104,11 +108,11 @@ let boundFunc = func.bind(context);
104
108
105
109
`func.bind(context)`는 함수처럼 호출 가능한 '특수 객체(exotic object)'를 반환합니다. 이 객체를 호출하면 `this`가 `context`로 고정된 함수 `func`가 반환됩니다.
106
110
107
-
따라서 `boundFunc`를 호출하면 `this`가 고정된 `func`를 호출하는 것과 동일한 효과를 봅니다.
111
+
따라서 `boundFunc`를 호출하면 `this`가 고정된 `func`를 호출하는 것과 동일한 효과를 봅니다.
108
112
109
113
아래 `funcUser`에는 `this`가 `user`로 고정된 `func`이 할당됩니다.
110
114
111
-
```js run
115
+
```js run
112
116
let user = {
113
117
firstName:"John"
114
118
};
@@ -119,19 +123,15 @@ function func() {
119
123
120
124
*!*
121
125
let funcUser =func.bind(user);
122
-
funcUser(); // John
126
+
funcUser(); // John
123
127
*/!*
124
128
```
125
129
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`의 '바인딩한 변형'이라고 생각하면 됩니다.
131
131
132
132
인수는 원본 함수 `func`에 '그대로' 전달됩니다.
133
133
134
-
```js run
134
+
```js run
135
135
let user = {
136
136
firstName:"John"
137
137
};
@@ -150,7 +150,6 @@ funcUser("Hello"); // Hello, John (인수 "Hello"가 넘겨지고 this는 user
150
150
151
151
이제 객체 메서드에 `bind`를 적용해 봅시다.
152
152
153
-
154
153
```js run
155
154
let user = {
156
155
firstName:"John",
@@ -177,50 +176,42 @@ user = {
177
176
178
177
`(*)`로 표시한 줄에서 메서드 `user.sayHi`를 가져오고, 메서드에 `user`를 바인딩합니다. `sayHi`는 이제 '묶인(bound)' 함수가 되어 단독으로 호출할 수 있고 `setTimeout`에 전달하여 호출할 수도 있습니다. 어떤 방식이든 컨택스트는 원하는 대로 고정됩니다.
179
178
180
-
아래 예시를 실행하면 인수는 '그대로' 전달되고 `bind`에 의해 `this`만 고정된 것을 확인할 수 있습니다.
179
+
아래 예시를 실행하면 인수는 '그대로' 전달되고 `bind`에 의해 `this`만 고정된 것을 확인할 수 있습니다.
181
180
182
181
```js run
183
182
let user = {
184
183
firstName:"John",
185
184
say(phrase) {
186
185
alert(`${phrase}, ${this.firstName}!`);
187
-
}
186
+
},
188
187
};
189
188
190
189
let say =user.say.bind(user);
191
190
192
-
<<<<<<<HEAD
193
191
say("Hello"); // Hello, John (인수 "Hello"가 say로 전달되었습니다.)
194
192
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
199
193
```
200
194
201
195
````smart header="`bindAll`로 메서드 전체 바인딩하기"
202
196
객체에 복수의 메서드가 있고 이 메서드 전체를 전달하려 할 땐, 반복문을 사용해 메서드를 바인딩할 수 있습니다.
203
197
204
198
```js
205
199
for (let key in user) {
206
-
if (typeof user[key] =='function') {
200
+
if (typeof user[key] =="function") {
207
201
user[key] = user[key].bind(user);
208
202
}
209
203
}
210
204
```
211
205
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
+
217
208
````
218
209
219
210
## 부분 적용
220
211
221
212
지금까진 `this` 바인딩에 대해서만 이야기해보았습니다. 한 단계 더 나아가 봅시다.
222
213
223
-
`this` 뿐만 아니라 인수도 바인딩이 가능합니다. 인수 바인딩은 잘 쓰이진 않지만 가끔 유용할 때가 있습니다.
214
+
`this` 뿐만 아니라 인수도 바인딩이 가능합니다. 인수 바인딩은 잘 쓰이진 않지만 가끔 유용할 때가 있습니다.
0 commit comments