1. var μ λν κ°λ μ 리
JavaScriptμ var λ³μλ λ€λ₯Έ μΈμ΄λ€κ³Ό μ‘°κΈ λ€λ₯΄κ² λμν©λλ€. μ΄λ λλλ‘ κ°λ°μλ‘ νμ¬κΈ μλνμ§ μμ κ²°κ³Όλ₯Ό λ°μνκΈ°λ ν©λλ€.
if(true){
var name = 'sean';
}
console.log(name);
for(var i=0; i<5; i++){
// do something
}
console.log(i);
μΌλ°μ μΈ νλ‘κ·Έλλ° μΈμ΄μμ λ³μλ λΈλ‘ μ€μ½ν { } μμμ μ ν¨νκΈ° λλ¬Έμ, λΈλ‘μ΄ μ’ λ£λ
μμ μμ console.logλ₯Ό νΈμΆνλ©΄ μ μμ μΌλ‘ λμνμ§ μμ κ²μ΄λΌ μμλ©λλ€.
νμ§λ§ μ λ ₯ν μμ€μ½λμ κ²°κ³Όλ‘ ‘sean’κ³Ό ‘5’κ° μ½μμ μ μμ μΌλ‘ μΆλ ₯μ΄ λ©λλ€.
μ΄λ¬ν νμμ΄ λ°μνλ μ΄μ κ° λ°λ‘ var λ³μκ° Hoisting λκΈ° λλ¬Έμ λλ€.
- Hoistingμ΄λ?
Hoistingμ varμ ν΅ν΄ μ μλ λ³μμ μ μΈλ¬Έμ μ ν¨ λ²μμ μ΅μλ¨μΌλ‘ λμ΄μ¬λ¦¬λ νμλ₯Ό λ§ν©λλ€. ‘μ μΈκ³Ό ν λΉμ λΆλ¦¬’λΌκ³ μκ°ν μλ μμ΅λλ€.
if(true){
var name = 'sean';
}
console.log(name);
μ μ½λλ Hoistingμ μν΄ μλμ κ°μ λͺ¨μμΌλ‘ λ°λκ² λ©λλ€.
var name;
if(true){
name = 'sean';
}
console.log(name);
var name = ‘sean’μ΄λΌκ³ μ μν λ³μκ° μ€μ λ‘λ μ μΈ(var name)κ³Ό ν λΉ(name = ‘sean’)λ‘ λΆλ¦¬λλ κ²μ λλ€. μ΄λ¬ν μ΄μ λ‘ if ꡬ문 λ°μμ name λ³μκ° μ¬μ© κ°λ₯νκ³ , for ꡬ문 λ°μμ I λ³μκ° μ¬μ© κ°λ₯ν νμμ΄ λ°μνλ κ²μ λλ€.
- κ·Έλ λ€λ©΄ Hoisting μ μ ν¨ λ²μ λ?
μλ°μ€ν¬λ¦½νΈμ varλ λ¨μν λΈλ‘{ }μ΄ μλ ν¨μ λΈλ‘ function{ } μμμ μ ν¨ν©λλ€.
μ΄λ₯Ό varλ “ν¨μ μ€μ½νμμ μ ν¨νλ€” λΌκ³ ν©λλ€.
function func1(){
if(true){
var name = 'sean';
}
console.log(name);
}
function func2(){
for(var i=0; i<5; i++){
// do something
}
console.log(i);
}
if(true){
var num = 50;
}
console.log(num);
μ μ½λλ Hoistingμ μν΄ λ΄λΆμμ μλμ κ°μ λͺ¨μμΌλ‘ λ°λκ² λ©λλ€.
var num;
function func1(){
var name;
if(true){
name = 'sean';
}
console.log(name);
}
function func2(){
var i;
for(i=0; i<5; i++){
// do something
}
console.log(i);
}
if(true){
num = 50;
}
console.log(num);
varλ ν¨μ μ€μ½νμμ μ ν¨νκΈ° λλ¬Έμ Hoisting μ, μ μΈλ¬Έμ κΈλ‘λ² μ€μ½νκ° μλ μ ν¨ λ²μ(function) λ΄λΆμ μ΅μλ¨μ μμΉνκ² λ©λλ€.
κΈλ‘λ² μ€μ½ν λν νλμ ν¨μ μ€μ½νμ²λΌ λμνκΈ° λλ¬Έμ Hoistingμ΄ μΌμ΄λ©λλ€.
- ν¨μμ Hoisting?
ν¨μμ μ μΈ μμ Hoistingμ λμμ λλ€. λλ¬Έμ μ€μ½ν λ΄μμ μ΄λ€ μμΉμμ ν¨μ μ μΈμ νλ μ§ νΈμΆν μ μμ΅λλ€.
sayName();
function sayName(){
console.log(‘sean’);
}
μ μ½λλ ν¨μ hoistingμΌλ‘ μΈν΄ μλμ κ°μ λͺ¨μμΌλ‘ λ³νκ² λ©λλ€.
function sayName(){
console.log(‘sean’);
}
sayName();
ν¨μ μ μΈ μμ μ΅μλ¨μΌλ‘ λμ΄μ¬λ €μ§κΈ° λλ¬Έμ sayName()μ λ¨Όμ νΈμΆνκ³ ν¨μ μ μλ₯Ό μ΄νμ νμ¬λ μ μμ μΌλ‘ λμνκ² λ©λλ€.
2. var μ λν λ¬Έμ μ
νλΆμμ C, C++, Java, Python λ±μ νλ‘κ·Έλλ° μΈμ΄λ₯Ό λ°°μ°λ€κ° JavaScriptλ₯Ό μ νκ² λλ,
var λ³μκ° Function scope λ₯Ό κ°λ κ²μ λν΄ μ°λ €κ° μκΉλλ€. var λ³μμ μ°λ €λλ μ μμ λ°μνλ λ¬Έμ μ λ€μ΄ μμ΅λλ€.
1) varλ‘ λ³μ μ μΈ μ var ν€μλ μλ΅ κ°λ₯
chicken = 'nice';
console.log(chicken); // nice
var ν€μλλ‘ μμνλ μ μΈλ¬Έμ μμ±νμ§ μμμΌλ μ μΈνμ¬ μ¬μ©μ΄ κ°λ₯ν©λλ€.
μ΄λ μ§κ΄μ μΈ μ½λ λ¦¬λ·°κ° μ΄λ €μμ§λ λ¬Έμ λ₯Ό μ λ°ν©λλ€.
2) λ³μ μ μΈ μ μ¬μ©
λ³μ μ μΈ μ μ λ³μλ₯Ό μ¬μ©νμ¬ λ³μκ° undefined κ°μ κ°λ κ²½μ°μ λλ€. μμμ μΈκΈν κ²μ²λΌ JavaScriptμμλ Hoisting μ ν΄μ λ³μλ ν¨μ μ μΈμ΄ μΈν°ν리ν°μ μν΄ μ΅μμλ‘ λμ΄μ¬λ €μ§λλ€.
for (var i = 0; i < rows.length; i++) {
var obj = {
patternId: patternId,
sortOrder: idx++
};
rowOrderArr.push(obj);
}
var patternId = $("#patternNameLabel").attr("patternId");
$.post('/delete.do', { order: JSON.stringify(rowOrderArr) });
μ μ½λμμ obj κ°μ²΄μ patternId μμ±μ νμ undefined κ°μΌλ‘ μ€μ λ©λλ€.
νμ§λ§ μλ¬λ λ°μνμ§ μκΈ° λλ¬Έμ μ€μ λ‘ λλ €λ³΄λ μμ μμμΌ λ¬Έμ λ₯Ό μ μ μκ² λ©λλ€.
κ°λ Ή rowOrderArr κ°μ²΄λ‘ μλ²μ AJAX νΈμΆμ νμ λμμΌ μ μ μμ΅λλ€.
(ν΄λΌμ΄μΈνΈμμ patternId κ°μ μ μ±μμ€μ μλ² μλ¬κ° λ©λλ€.)
3) λ³μ μ€λ³΅ μ μΈ
ν¨μ λ΄μ μ€λ³΅λ λ³μ μ μΈμ΄ μ‘΄μ¬νλ κ²½μ°μ λλ€.
κ°λ°μλ€μ΄ λ³μμ λ²μλ₯Ό μΌλ°μ μΌλ‘ μκ°νλ λ²μμΈ λΈλ λ²μ(block scope)λ‘ μκ°νκ³
μλμ κ°μ΄ pjtCode λ³μκ° κ° λΈλμ νμ λκ² μμ±μ νλ€κ³ κ°μ ν΄λ³΄κ² μ΅λλ€.
var idx = nextUrl.toUpperCase().indexOf('&PJTCODE=');
if (idx > -1){
var pjtCode = nextUrl.substr(idx + 9, 15);
if (idx > 9) {
var pjtCode = 'BAD_CODE';
}
console.log(pjtCode);
}
console.log(pjtCode);
JavaScriptλ λ³μκ° ν¨μ λ²μ(function scope)λ₯Ό κ°μ§κ³ Hoistingμ μν΄ μ μΈμ΄ λμ΄μ¬λ €μ§λ―λ‘, μ€μ λ‘ pjtCode λ³μλ ν¨μ λ΄μμ νλλ‘ μ μ§λ©λλ€.
μ¦, λ κ°μ μ½μ μΆλ ₯λ¬Έ λͺ¨λ BAD_CODEλ‘ μΆλ ₯λ©λλ€.(idxκ° 9λ³΄λ€ ν΄ κ²½μ°)
μ΄μ κ°μ΄ Hoistingμ JavaScript μ½λ ν΄μμ λΉμ§κ΄μ μΌλ‘ λ§λλ μΈ‘λ©΄μ΄ μμ΅λλ€.
4) λ³μ μ¬μ μ
λ³μλ₯Ό μ¬μ μν¨μΌλ‘μ¨ μ΄μ μ μ μν λ³μκ° μ¬μ©λμ§ μλ κ²½μ°μ λλ€.
if ($.browser.msie == true) {
target = url + "userName" + userName; // 1)
target = url.replace(/\.|\?|\&|\/|\=|\:|\-|\s/gi,""); // 2)
}
μ μ½λμμ 1)μ μ μλ target λ³μκ° 2)μμ μ¬μ μλλ©΄μ 1)μμ ν λΉν username νλΌλ―Έν°κ° 무μλ©λλ€. λ°λΌμ μλν λλ‘ κ²°κ³Όλ₯Ό μ»μΌλ €λ©΄ λ€μκ³Ό κ°μ΄ μμ λμ΄μΌ ν©λλ€.
if ($.browser.msie == true) {
target = url + "userName" + userName;
target = target.replace(/\.|\?|\&|\/|\=|\:|\-|\s/gi,"");
}
3. λ¬Έμ μ μ λν ν΄κ²°λ°©μ
ES6(ECMAScript 6th edition, λ§€ λ λ°ννλ μλ°μ€ν¬λ¦½νΈ νμ€) μ΄μ μλ λ³μλ₯Ό μ μΈνλ λ°©λ²μ΄ var λ₯Ό μ΄μ©νλ λ°©λ² λ°μ μμμ΅λλ€. νμ§λ§ μμμ μΈκΈν κ²κ³Ό κ°μ μ¬λ¬κ°μ§ λ¬Έμ λ€μ΄ λ°μνκ³ , ES6μμ μΆκ°λ let, const λ₯Ό μ¬μ©ν¨μΌλ‘μ¨ λ¬Έμ λ₯Ό ν΄κ²°ν μ μκ² λμμ΅λλ€.
1) block-level-scope variable(let, const)
Var λ function-level-scope λΌμ μ μ λ³μκ° λ¨λ°νλ λ¬Έμ λ€μ΄ λ§μμΌλ, let, const λ block-level-scope λΌμ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
let chicken = 'nice'; // μ μ λ³μ
{
// ReferenceError: chicken is not defined
console.log(chicken);
let chicken = 'nice';
console.log(chicken); // good
}
2) λ³μ μ€λ³΅ μ μΈ λΆκ°
Var μμλ λ³μλ₯Ό μμ μ μΈ ν λ€μ μλμμ μ¬μ μΈμ΄ κ°λ₯νμ΅λλ€. νμ§λ§ let, const λ μ¬μ μΈ μ λ¬Έλ² μλ¬κ° λΉλλ€.
let chicken = 'nice'; // μ μ λ³μ
{
// Identifier ‘chicken’ has already been declared
let chicken = 'good';
}
3) νΈμ΄μ€ν λΆκ°
μμμ μ€λͺ νλ―μ΄ varλ‘ λ³μ μμ± μ μ μΈκ³Ό μ΄κΈ°νκ° λμμ μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ Hoisting νμμ΄ λνλ¬μ΅λλ€. νμ§λ§ let, const λ λ³μ μμ± μ μ μΈκ³Ό μ΄κΈ°νκ° λΆλ¦¬λμ΄μ μ§νμ΄ λ©λλ€. let, const λ λ³μλ₯Ό μμ±νκ³ μ μΈκΉμ§ ν ν μΌμμ μ¬κ°μ§λκ° μ μΈκ³Ό μ΄κΈ°ν μ¬μ΄μ μκΈ°λ©°, ν λΉλ¬Έμμ λ³μ κ°μ΄ ν λΉ λ λ μ΄κΈ°ν λ° κ° ν λΉμ΄ μ΄λ£¨μ΄μ§λλ€.
// error: chicken is not defined
Console.log(chicken);
let chicken = 'nice';
μ 리νμλ©΄, ES6 λ₯Ό μ¬μ© κ°λ₯νλ€λ©΄ var λμ let, constλ₯Ό μ¬μ©νλ©΄ λ¬Έμ λ€μ ν΄κ²°ν μ μμ΅λλ€.
let μΌλ‘ λ³μ μ μΈ ν κ°μ μ¬ν λΉ κ°λ₯νμ§λ§, const λ‘ μ μΈ ν κ°μ μ¬ν λΉ ν μ μμ΅λλ€. κ°μ μ¬ν λΉ ν κ² κ°μΌλ©΄ letμ μ¬μ©νκ³ λ³νμ§ μλ κ°μλ const(μμ)λ₯Ό μ¬μ©νλ©΄ λ©λλ€.
4. μ°Έκ³ μ¬μ΄νΈ
- μλ°μ€ν¬λ¦½νΈ νΈμ΄μ€ν (Hoisting)
- varλ₯Ό μ¬μ©ν λ λ°μνλ λ¬Έμ λ€
(https://www.daleseo.com/js-var-issues/)
- JavaScriptμμ λ³μ μ¬μ© μ μ£Όμν μ
(https://cimfalab.github.io/deepscan/2016/07/variable-misuse)
- JavaScript let, constλ? κ·Έλ¦¬κ³ μ μ¨μΌλ§ νλκ°? (ES6)
(https://happycording.tistory.com/entry/let-const-%EB%9E%80-%EC%99%9C-%EC%8D%A8%EC%95%BC%EB%A7%8C-%ED%95%98%EB%8A%94%EA%B0%80-ES6)
'Languages > JavaScript π' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JS] μλ°μ€ν¬λ¦½νΈ ν¨μλ₯Ό λ³μμ ν λΉν μ μλ μ΄μ (0) | 2021.12.07 |
---|---|
[JS] μλ°μ€ν¬λ¦½νΈ μμ κ°κ³Ό κ°μ²΄(Immutability, Mutability) (0) | 2021.12.06 |