Function



function을 문자열로 선언할 수도 있다. 

그러나 이 방법은 function 내부의 코드가 복잡해질수록 가독성이 떨어지기 때문에 권장되지 않는 방법이다.

보통은 9 ~ 12줄에서 처럼 function을 선언한다.

var triangle1 = new Function('h', 'w', 'return h * w / 2');
console.log('Triangle 1: ' + triangle1(5, 2));

var param = 'h, w';
var formula = 'return h * w / 2';
var diamond = new Function(param, formula);
console.log('Diamond: ' + diamond(5, 2));

// function literal
var triangle2 = function(w, h) {
    return w * h / 2;
}

console.log('Triangle2: ' + triangle2(5, 2));


JavaScript에서는 함수의 인수의 개수나 type이 정해져있지 않다.

개발자가 의도한 인수의 개수 이상을 넣어도 오류가 나지 않는다.

// named argument
function triangle(args) {
    if (args.base == undefined) {
        args.base = 1;
    }
    
    if (args.height == undefined) {
        args.height = 1;
    }
    return args.base * args.height / 2;
}

console.log('Triangle1: ' + triangle({base: 10, height: 5}));
console.log('Traingle1: ' + triangle({}));

function triangle2(base, height, index) {
    console.log(base + '/' + height);
}

var base = 10;
var index = 20;
triangle2(base, index);
triangle2(base, index, 100, [10, 20]);


또한 JavaScript에서는 function의 인수로 function을 받을 수도 있다.

// Higher order function
function arrayWalk(data, func) {
    for (var key in data) {
        func(key, data[key]);
    }
}

function showElement(key, value) {
    console.log(key + ': ' + value);
}

var arr = [1, 2, 4, 8, 16];
arrayWalk(arr, showElement);

// anonymous function
arrayWalk(arr, function(key, value) {
    console.log(key + ': ' + value);
});


Scope



function 내에서 선언한 변수(Local 변수)가 Global 변수와 변수명이 같을 때 Local 변수를 우선적으로 참조한다.

또한 function 내에서 Global 변수와 같은 변수명으로 선언한 것보다 위에 그 변수를 참조하게 되면 선언되지 않은 변수로 인식을 한다.


var scope1 = 'Global var1';

function getValue1() { 
    console.log(scope1); // undefined
    var scope1 = 'Local Var1';
    return scope1;
}

console.log(getValue1()); // Local Var1
console.log(scope1); // Global Var1

var scope2 = 'Global Var2';

function getValue2() {
    scope2 = 'Local Var2';
    return scope2;
}

console.log(getValue2()); // Local Var2
console.log(scope2); // Local Var2


// not support block level scope
if (true) {
    console.log('True 1');
    var i = 5;
}

console.log(i); // 5

// support function level scope
(function() {
    if (true) {
        console.log('True 2');
        var j = 0;
    }
})();

console.log(j);

// ---------------------------------------------------------

// difference between function
var scope = 'Global Var';
function checkScope() {
    var scope = 'Local Var';
    
    var func1 = function() {
        return scope;
    }
    
    console.log(func1()); // Local Scope
    
    var func2 = new Function('return scope;');
    
    console.log(func2()); // Global Scope
}

checkScope();

// ---------------------------------------------------------

var x = 'Global';

function outerFunc() {
    var y = 'Local Outer';
    
    function innerFunc() {
        var z = 'Local Inner';
        
        console.log(x);
        console.log(y);
        console.log(z);
    }
    
    innerFunc();
}

outerFunc();


arguments



function showMessage(args) {
    console.log(arguments);
    console.log(arguments.length + ' / ' + args);
}

showMessage();
showMessage('Tomoto', 'Banana');

function paramTest() {
    for (var i = 0; i < arguments.length; i++) {
        console.log(arguments[i]);
    }
}

paramTest('a', 1, [10, 20, 30]);


재귀함수



function factorial(n) {
    if (n != 0) {
        return n * arguments.callee(n - 1);
    }
    
    return 1;
}

console.log(factorial(3));


'JavaScript' 카테고리의 다른 글

객체, 정규 표현식 등  (0) 2016.10.14
객체와 문자배열  (0) 2016.10.07

+ Recent posts