- ν¨μ μ μΈλ¬ΈμΌλ‘ μ μνλ λ°©λ²
function square(x) { return x * x; }
- ν¨μ 리ν°λ΄λ‘ μ μνλ λ°©λ²
var square = function (x) { return x * x; };
- Function μμ±μλ‘ μ μνλ λ°©λ²
var square = new Function("x", "return x*x");
- νμ΄ν ν¨μ ννμμΌλ‘ μ μνλ λ°©λ²
var square = (x) => x * x;
ν¨μ μ μΈλ¬ΈμΌλ‘ μ μν ν¨μλ νΈμΆλ¬Έμ΄ κ·Έλ³΄λ€ μμ μμΉν΄λ νΈμΆν μ μλ€.
(νΈμ΄μ€ν
μ μ©)
console.log(hoisting(5));
function hoisting(x) {
return x * x;
}
λ€λ₯Έ λ°©λ²λ€μ μλ¬κ° λλ€. (νΈμ΄μ€ν λΉμ μ©)
<μλ¬>
console.log(noHoisting(3));
var noHoisting = function (x) {
return x * x;
};
var noHoisting = new Function("x", "return x*x");
var noHoisting = (x) => x * x;
νΉμ ν¨μμ λ΄λΆμ μ μΈλ ν¨μλ₯Ό κ°λ¦¬μΌ κ·Έ ν¨μμ μ€μ²© ν¨μλΌκ³ νλ€.
λ°°μ΄ μμμ μ κ³±ν©μ λν μ κ³±κ·Όμ ꡬνλ ν¨μ
function norm(x) {
var sum2 = sumSquare();
return Math.sqrt(sum2);
function sumSquare() {
sum = 0;
for (var i = 0; i < x.length; i++) sum += x[i] * x[i];
return sum;
}
}
var a = [2, 1, 3, 5, 7];
var n = norm(a);
console.log(n);
- ν¨μ νΈμΆ
var s = square();
- λ©μλ νΈμΆ
obj.m = function () { console.log("hi"); }; obj.m();
- μμ±μ νΈμΆ
var obj = new Object();
- call, applyλ₯Ό μ¬μ©ν κ°μ νΈμΆ
var example = function (a, b, c) { return a + b + c; }; example(1, 2, 3); example.call(null, 1, 2, 3); // null = this example.apply(null, [1, 2, 3]); // null = this
var f = function () {
console.log("hello");
};
f();
κ·Έ μΈ λ°©λ² 1. //μ μ°μ΄μ§ μλλ€.
(function (a, b) { console.log(`hi1 / a = ${a} / b = ${b}`); })(1, 2);
κ·Έ μΈ λ°©λ² 2. //μ μ°μ΄μ§ μλλ€.
(function () { console.log("hi2"); })();
ν¨μ μ μμμ μμ±λ μΈμ κ°μλ³΄λ€ μΈμλ₯Ό μ κ² μ λ¬ν΄μ ν¨μλ₯Ό μ€ννλ©΄
μΈμμμ μλ΅ν μΈμλ undefinedκ° λλ€.
function f(x, y) {
console.log(x, y);
}
f(2);
// x = 2, y = undefined
μμ μ±μ§μ νμ©νμ¬ μΈμλ₯Ό μλ΅ν ν¨μλ₯Ό μ μν μ μλ€.
function multiply(a, b) {
b = b || 5; // μ΄κΉκ° μ€μ (μΌμͺ½ νΌμ°μ°μκ° trueλ©΄ μΌμͺ½ λ°ν, falseλ©΄ μ€λ₯Έμͺ½ λ°ν)
console.log(a * b);
}
multiply(2, 3); // (2*3) = 6
multiply(2); // (2*5) = 10
λͺ¨λ ν¨μμμ μ¬μ©ν μ μλ μ§μλ³μλ‘λ μ μ¬ λ°°μ΄ κ°μ²΄μΈ argumentsκ° μλ€.
arguments[0]; // 첫λ²μ§Έ μΈμ κ°
arguments[1]; //λλ²μ§Έ μΈμ κ°
arguments[n - 1]; // nλ²μ§Έ μΈμκ°
arguments.length //μΈμ κ°μ
arguments.callee //μ€νλκ³ μλ ν¨μμ μ°Έμ‘°
function arg(x, y) {
arguments[1] = 3;
console.log(
`x = ${x}, y = ${y},
arguments length is ${arguments.length},
arguments callee ${arguments.callee}`
);
}
arg(1, 2);
μ ν¨μ μ€ν κ²°κ³Ό β
arguments.calleeκ° ν¨μ μ 체λ₯Ό κ°μ Έμ¨ κ±Έ νμΈ ν μ μλ€.
x = 1, y = 3,
arguments length is 2,
arguments callee function arg(x, y) {
arguments[1] = 3;
console.log(
`x = ${x}, y = ${y},
arguments length is ${arguments.length},
arguments callee ${arguments.callee}`
);
}
ν¨μκ° μκΈ° μμ μ νΈμΆνλ νμλ₯Ό μ¬κ·νΈμΆ μ¬κ·νΈμΆμ μννλ ν¨μλ₯Ό μ¬κ·ν¨μ λΌκ³ νλ€.
μ¬κ·ν¨μμ λνμ μΈ μμ λ‘λ ν©ν 리μΌμ΄ μλ€.
function fact1(n) {
if (n <= 1) return 1;
return n * fact1(n - 1);
}
console.log(fact1(5));
arguments.callee μ¬μ© μ½λ
var fact3 = function (n) {
if (n <= 1) return 1;
return n * arguments.callee(n - 1);
};
console.log(fact3(5));
μ¬κ·ν¨μ μ£Όμμ β
function hanoi(n, a, b, c) {
if (n < 1) return;
hanoi(n - 1, a, c, b);
console.log(`${n} λ²μ§Έ μλ° : ${a} -> ${c}`);
hanoi(n - 1, b, a, c);
}
console.log(hanoi(3, "A", "B", "C"));
μ ν¨μ μ€ν κ²°κ³Ό β
1 λ²μ§Έ μλ° : A -> C
2 λ²μ§Έ μλ° : A -> B
1 λ²μ§Έ μλ° : C -> B
3 λ²μ§Έ μλ° : A -> C
1 λ²μ§Έ μλ° : B -> A
2 λ²μ§Έ μλ° : B -> C
1 λ²μ§Έ μλ° : A -> C
function quicksort(x, first, last) {
var p = x[Math.floor((first + last) / 2)];
for (var i = first, j = last; ; i++, j--) {
while (x[i] < p) i++;
while (p < x[j]) j--;
if (i >= j) break;
var w = x[i];
x[i] = x[j];
x[j] = w;
}
if (first < i - 1) {
quicksort(x, first, i - 1);
}
if (j + 1 < last) {
quicksort(x, j + 1, last);
}
}
var a = [4, 7, 2, 5, 1, 8, 9, 3];
quicksort(a, 0, a.length - 1);
console.log(a);
μλ°μ€ν¬λ¦½νΈ μμ§μ μ€ν κ°λ₯ν μ½λλ₯Ό λ§λλ©΄ κ·Έ μ½λλ₯Ό νκ°ν΄μ μ€ν λ¬Έλ§₯μΌλ‘ λ§λ λ€.
μ€ν κ°λ₯ν μ½λ
μ€ν λ¬Έλ§₯μ μ€ν κ°λ₯ν μ½λκ° μ€μ λ‘ μ€νλκ³ κ΄λ¦¬λλ μμ, μ»΄ν¬λνΈ μ¬λ¬ κ°κ° λλμ΄ κ΄λ¦¬
μλ μ½λλ κ°μ²΄ ννμ λΉλ¦° μμ¬μ½λμ
// μ€ν λ¬Έλ§₯
ExecutionContext {
// λ μ컬 νκ²½ μ»΄ν¬λνΈ
LexicalEnvironment: {},
// λ³μ νκ²½ μ»΄ν¬λνΈ
VariableEnvironment: {},
// λμ€ λ°μΈλ© μ»΄ν¬λνΈ
ThisBinding : null,
}
λ μ컬 νκ²½ μ»΄ν¬λνΈμ λ³μ νκ²½ μ»΄ν¬λνΈλ κ°μ κ²μ΄λΌ λ΄λ 무방νλ€.
λ μ컬 νκ²½ μ»΄ν¬λνΈ
μλ μ½λλ κ°μ²΄ ννμ λΉλ¦° μμ¬μ½λμ
// λ μ컬 νκ²½ μ»΄ν¬λνΈ
LexicalEnvironment: {
// νκ²½ λ μ½λ
EnvironmentRecord: {},
// μΈλΆ λ μ컬 νκ²½ μ°Έμ‘°
OuterLexicalEnvironment Reference: {}
}
νκ²½ λ μ½λ - μ ν¨ λ²μ μμ ν¬ν¨λ μλ³μλ₯Ό κΈ°λ‘νκ³ μ€ννλ μμ
μΈλΆ λ μ컬 νκ²½ μ°Έμ‘° - μ€μ²©λ ν¨μ μμμ λ°κΉ₯ μ½λμ μ μλ λ³μλ₯Ό μ½κ±°λ μ¨μΌ ν λ κ·Έ λ³μλ₯Ό κ²μνλ μν
μλ°μ€ν¬λ¦½νΈ μΈν°ν리ν°λ μμνμλ§μ λ μ컬 νκ²½ νμ μ μ μ νκ²½μ μμ±νλ€.
// μ μ νκ²½
GlobalEnvironment = {
ObjectEnvironmentRecord: {
bindObject: window
},
OuterLexicalEnvironmentReference: null
}
// μ μ μ€ν λ¬Έλ§₯
ExecutionContext = {
LexicalEnvironment: GlobalEnvironment,
ThisBinding: window,
}
μ μ νκ²½κ³Ό μ μ κ°μ²΄λ₯Ό μμ±ν ν, νλ‘κ·Έλ¨μ μ½μ΄ λ€μΈλ€. λ€ μ½μ΄ λ€μΈ νμλ νλ‘κ·Έλ¨μ νκ°νλ©° μ΅μμ λ 벨μ varλ¬ΈμΌλ‘ μμ±ν μ μ λ³μλ μ μ νκ²½μ νκ²½ λ μ½λμ νλ‘νΌν°λ‘ μΆκ°λλ€.
var a = { x: 1, y: 2 };
console.log(window.a); // -> Object {x=1, y=2}
function norm(x) {
return;
}
console.log(window.norm); // -> norm(x)
μ΅μμ λ 벨μ μ μΈλ λ³μμ ν¨μλ νλ‘κ·Έλ¨μ νκ°νλ μμ μ νκ²½ λ μ½λ(κ°μ²΄ νκ²½ λ μ½λ)μ μΆκ°λλ€. κ·Έλ¦¬κ³ μ΄λ―Έ κ°μ²΄ νκ²½ λ μ½λμ μΆκ°λ μνμ΄κΈ° λλ¬Έμ μ½λμ μ΄λ μμΉμ μμ±ν΄λ μ 체 νλ‘κ·Έλ¨μ΄ μ°Έμ‘° ν μ μλ€. μ΄κ²μ΄ λμ΄μ¬λ¦Ό (Hoisting) νμμ μ€μ²΄λ€.
νλ‘κ·Έλ¨μ΄ νκ°λ λ€μ μ€νλλλ°, νλ‘κ·Έλ¨μ μ€ν λ¬Έλ§₯ μμμ μ€νλλ€. κ·Έλ¦¬κ³ μ€ν λ¬Έλ§₯μ μ€νκ΅¬μ‘°λ‘ κ΄λ¦¬λλ€.
μ±κΈμ€λ λ - νλ‘κ·Έλ¨ ν κ°μ μ²λ¦¬ νλ¦μΌλ‘ νλ‘κ·Έλ¨μ μμ°¨μ μΌλ‘ μ€ν
λ©ν°μ€λ λ - νλ‘κ·Έλ¨ μ¬λ¬ κ°μ μ²λ¦¬ νλ¦μΌλ‘ λμμ μμ
μ λ³λ ¬λ‘ μ€ν
ν¨μκ° νΈμΆλμ΄ μ€νλλ μμ μ thisκ°μ΄ κ²°μ λλλ° μ΄ this κ°μ
ν¨μκ° νΈμΆλμμ λ κ·Έ ν¨μκ° μν΄ μλ κ°μ²΄μ μ°Έμ‘° μ΄λ€.
var tom = {
name: "Tom",
sayHello: function () {
console.log("Hello! " + this.name); // Hello! Tom μΆλ ₯
},
};
tom.sayHello();
λ€μμ λ€μν μν©μμ thisκ° μ΄λ€ κ°μ²΄λ₯Ό κ°λ¦¬ν€λμ§ μ 리ν κ²μ λλ€.
- μ΅μμ λ 벨 μ½λμ this (μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.)
console.log(this); // -> Window- μ΄λ²€νΈ μ²λ¦¬κΈ° μμ μλ this
- μμ±μ ν¨μ μμ μλ this
- μμ±μμ prototype λ©μλ μμ μλ this
μ€μ²© ν¨μμ μΈλΆ ν¨μ νΉμ μ μ μ½λμμ κ°μ μ΄λ¦μ κ°μ§ λ³μλ₯Ό μ¬μ©νλ©΄ μΆ©λμ΄ λ°μνλ€.
μ΄λ λ³μ xκ° μ΄λμμ μ μΈλ λ³μμΈμ§ κ²°μ νλ μμ
μ κ°λ¦¬μΌ λ³μ xμ μλ³μ κ²°μ μ΄λΌκ³ νλ€.
μλ³μ κ²°μ κ·μΉμ μ’ λ μμͺ½ μ½λμ μ μΈλ λ³μλ₯Ό μ¬μ©νλ€.
var a = "A";
// λ«ν ν¨μ
function f() {
var b = "B";
// μ΄λ¦° ν¨μ
function g() {
var c = "C"; // μλ° λ³μ
console.log(a + b + c);
}
g();
}
f();
μλ° λ³μ - μΌλ°μ μΈ ν¨μμ μΈμμ μ§μ λ³μ
μμ λ³μ - κ·Έ μΈ λ³μ
λ«ν ν¨μ - μλ° λ³μλ§ ν¬ν¨ν ν¨μ
μ΄λ¦° ν¨μ - μμ λ³μλ₯Ό κ°μ§κ³ μλ ν¨μ
μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄λ₯Ό μμ±νλ©΄ λ©λͺ¨λ¦¬ 곡κ°μ΄ μλμΌλ‘ λμ ν λΉ λλ€. κ·Έλ¦¬κ³ μ¬μ©νμ§ μλ κ°μ²΄μ λ©λͺ¨λ¦¬ μμμ κ°λΉμ§ 컬λ ν°κ° μλμΌλ‘ ν΄μ νλ€.
var p = {x:1, y:2};
console.log(p); // -> Object {x=1, y=2}
p = null; // -> Object {x=1, y=2}λ₯Ό λ©λͺ¨λ¦¬μμ ν΄μ
λ°λΌμ νλ‘κ·Έλμλ νμν κ°μ²΄λ₯Ό μμ±νκΈ°λ§ νλ©΄ λλ€. κ·Έλ λ€κ³ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό 무μν΄μλ μλλ€. νμμμ΄μ§ κ°μ²΄κ° κ³μ λ¨μ μμ΄ λ©λͺ¨λ¦¬ λμκ° λ°μνλ©΄ μ±λ₯μ΄ ν¬κ² μ νλ μ μλ€.
μκΈ° μμ μ΄ μ μλ νκ²½μμ ν¨μ μμ μλ μμ λ³μμ μλ³μ κ²°μ μ μ€ννλ€.
var a = "A";
// λ«ν ν¨μ
function f() {
var b = "B";
// μ΄λ¦° ν¨μ
function g() {
var c = "C"; // μλ° λ³μ
console.log(a + b + c);
}
g();
}
f();
μμ μ½λλ₯Ό 보면 ν¨μ gκ° μ μλ λ μ컬 νκ²½μ λ³μ aκ° μ μΈλ μμ λΆν° fν¨μκ° νΈμΆλ κ³³ κΉμ§μ΄λ€. κ·Έλ¦¬κ³ μ΄ λ μ컬 νκ²½μμ ν¨μ gμ μμ λ³μ aμ bμ μλ³μλ₯Ό κ²°μ νλ€.
μ¦, ν¨μ gμ ν¨μ κ°μ²΄μ κ°μ²΄κ° μ°Έμ‘°νλ λ μ컬 νκ²½ μ»΄ν¬λνΈκ° μμ λ³μ a, bμ μλ³μ κ²°μ μ μν μλ£ κ΅¬μ‘°λΌκ³ ν μ μλ€.
μκΈ° μμ μ΄ μ μλ νκ²½μμ ν¨μ μμ μλ μμ λ³μμ μλ³μ κ²°μ μ μ€ννλ€.
function Person(name, age) {
var _name = name;
var _age = age;
return {
getName: function () {
return _name;
},
getAge: function () {
return _age;
},
setAge: function (x) {
_age = x;
},
};
}
var person = Person("Tom", 20);
console.log(person.getName()); // Tom
console.log(person.getAge()); // 20
person.setAge(22);
console.log(person.getAge()); // 22
μ μ λ³μμ μ μ ν¨μλ₯Ό μ μ κ°μ²΄μ μ μΈνλ νμλ₯Ό κ°λ¦¬μΌ μ μ μ ν¨ λ²μλ₯Ό μ€μΌμν¨λ€λΌκ³ νλ€. λ€μκ³Ό κ°μ μν©μΌ λ μ΄λ¦μ΄ κ²ΉμΉ μ μλ€.
κ°μ²΄λ₯Ό μ΄λ¦ 곡κ°μΌλ‘ νμ©
var myApp = myApp || {}
myApp.name = "Tom";
myApp.showName = function() {...};
ν¨μλ₯Ό μ΄λ¦ 곡κ°μΌλ‘ νμ©
ν¨μμμ μ μΈλ λ³μλ κ·Έ ν¨μ λ΄λΆμμλ§ μ¬μ©λλ μ μ νμ©
var x = "global x";
(function () {
var x = "local x";
var y = "local y";
console.log(x); // local x
console.log(y); // local y
})();
console.log(x); // global x
console.log(y); // y is not defined