Skip to content

javascript_in_depth_10

paul edited this page Apr 20, 2017 · 1 revision

๋””์ž์ธ ํŒจํ„ด ์‹ค์šฉ - Self-defining function ํŒจํ„ด

Self-defining function์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์žฌ์ •์˜ํ•˜๊ณ  ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์—์„œ ๋‚˜์˜จ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

ํ™œ์šฉ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ํŠน์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ์ด๋Ÿด ๋•Œ ์ตœ์ดˆ ์ฆ‰์‹œ ํ˜ธ์ถœ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ Init-time branching ํŒจํ„ด ๋“ฑ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ์ž์ฃผ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์›น ํŽ˜์ด์ง€์ƒ์—์„œ ํ•œ ๋ฒˆ๋„ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋Š” ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋ฅผ ๋ฌด์กฐ๊ฑด ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ์ž์›์„ ์ถ”๊ฐ€๋กœ ์†Œ๋ชจํ•˜๊ฒŒ ๋œ๋‹ค.
์ด๋Ÿด ๋•Œ Self-defining function ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋“ค์˜ ์ปดํ“จํŒ… ์ž์› ์†Œ๋ชจ๋ฅผ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋ฅผ ๋ถ„์‚ฐํ•จ์œผ๋กœ์จ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์€ ๋ฐ”๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

ํŠน์ง•

Self-defining function ํŒจํ„ด์˜ ์žฅ์ ์€ ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ณด์ด๋Š” ๋ณ€๊ฒฝ ์ ์€ ์—†์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๊ณ  ๋‚˜์„œ ์ดํ›„์˜ ์ฒ˜๋ฆฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ๋•Œ์— ๋”ฐ๋ผ์„œ๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ํด๋กœ์ €๋ฅผ ํ™œ์šฉํ•ด์„œ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผํšŒ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜์šฉํ•˜๊ธฐ์— ์ข‹์€ ํŒจํ„ด์ด๋‹ค. ๋‹จ์ ์ด๋ผ๋ฉด ๋ถˆํ•„์š”ํ•œ ํด๋กœ์ €๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ ์•ˆ ํ•  ๊ฒƒ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ undefined๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์˜ˆ์ œ

// Self-defining function ํŒจํ„ด์„ ์ด์šฉํ•œ getXHR ์ •์˜
// getXHR()์€ ์ตœ์ดˆ๋กœ ํ˜ธ์ถœ๋  ๋•Œ XMLHttpRequest๋ฅผ ์ •์˜ํ• ์ง€ ๋ถ„๊ธฐํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ 
// ํ˜ธ์ถœ๋œ getXHR() ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ •์˜ํ•˜์—ฌ ์ดํ›„์—๋Š” ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•œ๋‹ค.
var getXHR = function () {
    var xhr;
    if (window.XMLHttpRequest) {
        getXHR = function () {
            return new XMLHttpRequest();
        };
        return new XMLHttpRequest();
    }
    try {
        xhr = new ActiveXObject("MSXML2.XMLHTTP.6.0");
        getXHR = function () {
            return new new ActiveXObject("MSXML2.XMLHTTP.6.0");
        };
        return xhr;
    } catch (e) {
        try {
            xhr = new ActiveXObject("MSXML2.XMLHTTP.3.0");
            getXHR = function () {
                return new ActiveXObject("MSXML2.XMLHTTP.3.0");
            };
            return xhr;
        } catch (e) {
            alert("This browser does not support XMLHttpRequest")
        }
    }
};
// Self-defining function ํŒจํ„ด์„ ์ด์šฉํ•œ ํ•จ์ˆ˜ ์ดˆ๊ธฐํ™”
// ์ตœ์ดˆ ํ˜ธ์ถœ์‹œ DOM ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ๊ณผ DOM ํƒ์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ์ด์šฉํ•˜๊ณ 
// ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹

<html>
<head>
    <style>
    #commentWrapper {
        width: 200px;
    }
    .comment {
        width: 150px;
        display: inline-block;
    }
    .name {
        width: 40px;
        display: inline-block;
    }
    </style>
</head>
<body>
    <div id="commentWrapper">
        <div>
            <div class="comment">Comment</div>
            <div class="name">Name</div>
        </div>
    </div>

    <form id="formComment">
        <label>Comment: <input type="text" id="comment"></input></label>
        <label>Name: <input type="text" id="name"></input></label>
        <input type="submit"></input>
    </form>

    <script>
    (function () {
        var addComment = function () {
            var divCommentWrapper = document.getElementById("commentWrapper"),
                divCommentRow = document.createElement("div"),
                divComment = document.createElement("div"),
                divName = document.createElement("div"),
                inputComment = document.getElementById("comment"),
                inputName = document.getElementById("name");

            divComment.className = "comment";
            divName.className = "name";
            divCommentRow.appendChild(divComment);
            divCommentRow.appendChild(divName);

            addComment = function () {
                divComment.innerHTML = inputComment.value;
                divName.innerHTML = inputName.value;
                inputComment.value = "";
                inputName.value = "";

                divCommentWrapper.appendChild(divCommentRow.cloneNode(true));
            };
            addComment();
        };
        document.getElementById("formComment").addEventListener("submit", function () {
            addComment();
            event.returnValue = false;
            return false;
        });
    }());
    </script>
</body>
</html>
// Self-defining function ํŒจํ„ด์„ ์ด์šฉํ•œ ์ธ์ฆ ์ •๋ณด ๋ณด๊ด€ ๋ฐ ์ค‘๋ณต ์š”์ฒญ ๋ฐฉ์ง€
(function () {
    var requestAuthentication = function (information) {
        var _requestAuthentication = requestAuthentication,
            authInformation = null;

        requestAuthentication = function (information) {
            if (authInformation === null) {
                alert("Already requesting");
                return;
            } else {
                return authInformation;
            }
        }

        sendRequest(information);

        function sendRequest(information) {
            var xhr = new XMLHttpRequest();
            xhr.open("POST", "/auth");
            xhr.onload = function () {
                alert("Authorized!");
                authInformation = xhr.responseText; 
                // ์ˆ˜ํ–‰์‹œ์— ์›๋ž˜ ์ธ์ฆ ์š”์ฒญ ํ•จ์ˆ˜๋กœ ์„ค์ •ํ•ด๋†“์„ ์ˆ˜๋„ ์žˆ๋‹ค.
                // requestAuthentication = _requestAuthentication
            };
            xhr.onerror = function () {
                if (confirm("Error occurred, send again?")) {
                    sendRequest(information);
                }
            }
            xhr.send(information);
        }
    }

    requestAuthentication("name=hello&password=world");
}());

Clone this wiki locally