í´ëĄě
ěŹęˇ / ęł ě°¨ í¨ě / Underdash JS
ě¤ě˝í
ěëłěě ëí ě í¨ë˛ě뼟 ë§íë¤.
ES5ęšě§ě ěë°ě¤íŹëŚ˝í¸ë ě ě ęłľę°
ě ě ě¸í늴 ě¤ě§ í¨ě
ě ěí´ěë§ ě¤ě˝íę° ěěąëë¤.
(ES6ěěë ë¸ëĄ
ě ěí´ěë ě¤ě˝í 경ęłę° ë°ěíë¤.)
ě¤í 읨í ě¤í¸
ě¤íí ě˝ëě ě ęłľí í경 ě ëł´ë¤ě 모ěëě ę°ě˛´ëĽź ë§íë¤.
íëě ě¤í 읨í
ě¤í¸ëĽź 꾏ěąí ě ěë ë°Šë˛ěźëĄë ě ě ęłľę°, eval() í¨ě, í¨ě ě¤í
ëąě´ ěë¤.
ě´ë VariableEnvironment, LexicalEnvironment, ThisBindingěźëĄ 꾏ěąëë¤.
ë¸ëĄ ě¤ě˝íę° ě길 ëë§ë¤ 읨í
ě¤í¸ę° ěę¸°ęł , ě´ ěť¨í
ě¤í¸ë ë¸ëĄě´ ëë늴 ěŹëźě§ë¤.
outerEnvironmentReference
íěŹ í¸ěśë í¨ěę° ě ě¸ë ëšě
ě LexicalEnvironment(ěŚ, ë°ëĄ ě§ě 읨í
ě¤í¸ě LexicalEnvironment)뼟 참쥰íë¤.
ě¸ëś í¨ěě ě§ě ëłě
뼟 참쥰íë ë´ëś í¨ěę° ě¸ëśëĄ ě ëŹëě ë
, ě¸ëś í¨ěě ě¤í 읨í
ě¤í¸ę° ě˘
ëŁë ě´íěë ě¸ëś í¨ěě ě§ě ëłěę° ěŹëźě§ě§ ěë íě
cf. 'ě¸ëśëĄ ě ëŹ'ě ě미 : ë´ëś í¨ě뼟 댏í´(return) or ë´ëś í¨ě뼟 ě˝ë°ą í¨ěëĄ ě ëŹ
1ě´ ę°ę˛ŠěźëĄ 0ëśí° 3ęšě§ ěěëëĄ ěśë Ľí ę˛
í´ëĄě 뼟 ěŹěŠíě§ ěěë¤.
for (var i = 0; i < 4; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
varě ěí´ ě ě¸ë ëłě ië ě ě ëłěëĄ í¸ě´ě¤í
ëë¤.
for ë°ëłľëŹ¸ě ë ëë§ë¤ ëłě iě ę°ě for 읨í
ě¤í¸ě ě ěĽëě§ ěęł ě ě 읨í
ě¤í¸ě ě
ë°ě´í¸ëë¤.
for ë°ëłľëŹ¸ě 쥰깴ě ë§ěĄąí늴 setTimeout í¨ěę° ě¤íëë¤.
for ë°ëłľëŹ¸ě ěëę° ë§¤ě° ëš ëĽ´ę¸° ë돸ě setTimeoutě ě˝ë°ą í¨ěę° ě¤íë기ęšě§ 기ë¤ë ¤ěź íë 1ě´ ëě ě ě ëłě iě ě´ę¸°ę°ě¸ 0ě ë°ëĄ ě ěĽëě§ ěęł ęłě ě
ë°ě´í¸ëë¤.
ę˛°ęľ for ë°ëłľëŹ¸ě´ ëëŹě ë ě ě 읨í
ě¤í¸ě environmentRecorděë 4ě ę°ě ę°ě§ë ě ě ëłě ię° ě ěĽëë¤.
1ě´ę° ě§ë í setTimeoutě ě˝ë°ą í¨ěę° ě¤íëě´ 4ę° ęą°ě ëěě 4ë˛ ë°ëłľíěŹ ěśë Ľëë¤.
í´ëĄě 뼟 ěŹěŠíë¤.
for (let i = 0; i < 4; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
ě ě ëłěëĄ í¸ě´ě¤í ěí¤ë var í¤ěë ëě let í¤ěë뼟 ěŹěŠíë¤.
ë§ě°Źę°ě§ëĄ for ë°ëłľëŹ¸ě 쥰깴ě ë§ěĄąíěŹ setTimeout í¨ěę° ě¤íëë¤.
for ë°ëłľëŹ¸ě í ë˛ ë ëë§ë¤ for 읨í
ě¤í¸ę° íëěŠ ěěąëë¤.
for 읨í
ě¤í¸ě LexicalEnvironmentě environmentRecordě ě§ě ëłě(ëłěëŞ
) iě ę°ě´ ě ěĽëë¤.
for 읨í
ě¤í¸ ěěě ë¤ě setTimeout 읨í
ě¤í¸ę° ěěąëë¤.
setTimeout í¨ěě ě˝ë°ą í¨ěěě ëłě ië ꡸ outerEnvironmentReference뼟 ęą°ěŹëŹ ěŹëźę° for 읨í
ě¤í¸ě ě ěĽëě´ ěë ě§ě ëłě iě ę°ě 참쥰íë¤.
(for 읨í
ě¤í¸ę° ě˘
ëŁëě´ë ě§ě ëłě iě ę°ě ěŹëźě§ě§ ěëë¤.)
í´ëĄě 뼟 ěŹěŠíë¤.
for (var i = 0; i < 4; i++) {
(function (x) {
setTimeout(function () {
console.log(x);
}, 1000 * x);
})(i);
}
let í¤ěë ëě ěŚě ě¤í í¨ě뼟 ě´ěŠí´ ëłě i뼟 ě§ě ëłěëĄ ë§ë¤ě´ ě ěĽíë¤.
for ë°ëłľëŹ¸ě 쥰깴ě ë§ěĄąíěŹ ěŚě ě¤í í¨ěę° ě¤íëë¤.
for ë°ëłľëŹ¸ě í ë˛ ë ëë§ë¤ for 읨í
ě¤í¸ę° íëěŠ ěěąëë¤.
ěŚě ě¤í í¨ě 읨í
ě¤í¸ě LexicalEnvironmentě environmentRecordě ě§ě ëłě(매ę°ëłě) iě ę°ě´ ě ěĽëë¤.
for 읨í
ě¤í¸ ěě ěŚě ě¤í í¨ě 읨í
ě¤í¸ę°, ꡸ ěěë setTimeout 읨í
ě¤í¸ę° ěěąëë¤.
setTimeout í¨ěě ě˝ë°ą í¨ěěě ëłě ië ꡸ outerEnvironmentReference뼟 ęą°ěŹëŹ ěŹëźę° ěŚě ě¤í í¨ě 읨í
ě¤í¸ě ě ěĽëě´ ěë ě§ě ëłě iě ę°ě 참쥰íë¤.
(ěŚě ě¤í í¨ě 읨í
ě¤í¸ę° ě˘
ëŁëě´ë ě§ě ëłě iě ę°ě ěŹëźě§ě§ ěëë¤.)