티스토리 뷰

do/javascript

javascript 2

dooo.park 2019. 4. 26. 15:52

유효범위(scope)

변수의 수명을 나타낸다.

var vscope = 'global';
function fscope(){
	alert(vscope);
}
fscope(); // global 전역변수 이므로 함수 밖에서 선언한 vscope에 접근할 수 있다.

함수 밖에서 변수를 선언하면 전역변수가 된다.

전역변수는 애플리케이션 전역에서 접근이 가능하다.

어떤 함수 안에서도 전역변수에 접근할 수 있다. 

 

같은 이름의 지역변수와 전역변수가 동시에 정의되어 있으면 지역변수가 우선된다.

var vscope = 'global';
function fscope(){
	var vscope = 'local';
    alert('함수안'+vscope);
}
fscope(); // 함수안 local
alert('함수밖'+vscope); // 함수밖 global

var를 사용하지 않은 지역변수는 전역변수가 된다.

var vscope = 'global';
function fscope(){
    vscope = 'local';
    alert('함수안'+vscope); 
}
fscope(); // 함수안 local
alert('함수밖'+vscope); // 함수밖 local

 

전역변수의 사용

전역변수를 사용해야 하는 경우에는 하나의 객체를 전역변수로 만들고 객체의 속성으로 변수를 관리한다.

MYAPP = {}
MYAPP.calculator = {
    'left' : null,
    'right' : null
}
MYAPP.coordinate = {
    'left' : null,
    'right' : null
}

MYAPP.calculator.left = 10;
MYAPP.calculator.right = 20;
function sum(){
	return MYAPP.calculator.left + MYAPP.calculator.right;
}
document.write(sum()); // 30

전역변수를 사용하고 싶지 않다면 익명함수를 호출하면 된다.

(function(){
    var MYAPP = {}
    MYAPP.calculator = {
        'left' : null,
        'right' : null
    }
    MYAPP.coordinate = {
        'left' : null,
        'right' : null
    }
    MYAPP.calculator.left = 10;
    MYAPP.calculator.right = 20;
    function sum(){
        return MYAPP.calculator.left + MYAPP.calculator.right;
    }
    document.write(sum());
}())    

함수 유효 범위

for(var i = 0; i < 1; i++){
	var name = 'aa';
}
alert(name); // aa

아래는 에러가 발생한다. name은 지역변수로 for문 안에서 선언되었는데 이를 for문 밖에서 호출하기 때문이다.

for(int i = 0; i < 10; i++){
	String name = "aa";
}
System.out.println(name);

★ 자바스크립트의 지역변수는 함수에서만 유효하다.

 

정적 유효범위

자바스크립트는 함수가 선언된 시점에서의 유효범위를 갖는다.

이를 정적 유효범위(static scoping) 혹은 렉시컬(lexical scoping)이라고 한다.

var i = 5;
function a(){
    var i = 10;
    b();
}
function b(){
    document.write(i);
}
a(); // 5

값으로서의 함수

javascript의 함수는 값이 될 수 있다.

function a(){}

함수 a는 변수 a에 담겨진 값이다. 

함수는 객체의 값으로 포함될 수 있다. 이렇게 객체의 속성 값으로 담겨진 함수를 메소드(method)라고 부른다.

a = {
    b: function(){
    }
};

함수는 값이기 때문에 다른 함수의 인자로 전달될 수도 있다.

function cal(func, num){
    return func(num)
}
function increase(num){
    return num+1
}
function decrease(num){
    return num-1
}
alert(cal(increase, 1)); // 2
alert(cal(increase, 1)); // 0

함수는 함수의 리턴값으로도 사용할 수 있다.

var process = [
    function(input) { return input + 10;},
    function(input) { return input * input;},
    function(input) { return input + input / 2;}
];
var input = 1;
for(var i = 0, i < process.length; i++){
    input = process[i](input);
}
alert(input);

콜백

처리 위임

값으로 사용될 수 있는 특성을 이용하면 함수의 인자로 함수에 전달할 수 있다. 

function sortNumber(a,b){
    return b-a; // a와 b의 순서를 바꾸면 정렬순서가 반대가 된다.
}
var numbers = [20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
alert(numbers.sort(sortNumber)); // array, [20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

비동기 처리

시간이 오래걸리는 작업이 있을 때 작업이 완료된 후에 처리할 일을 콜백으로 지정하면

해당 작업이 끝났을 때 미리 등록한 작업을 실행하도록 할 수 있다.

 

datasource.json.js

{"title":"JavaScript", "name":"aa"}

demo1.html

<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
</head>
<body>
<script type="text/javascript">
    $.get('./datasource.json.js', function(result){
        console.log(result);
    }, 'json');
</script>
</body>
</html>

 

클로저(closure)

클로저는 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가르킨다.

 

내부함수

자바스크립트는 함수 안에서 또 다른 함수를 선언할 수 있다.

function outter(){
    function inner(){
        var title = 'coding everybody';
        alert(title);
    }
    inner();
}
outter(); // coding everybody

함수 outter의 내부에는 함수 inner가 정의되어 있다. 이를 내부함수라고 한다.

내부함수는 외부함수의 지역변수에 접근할 수 있다.

function outter(){
    var title = 'coding everybody';
    function inner(){
        alert(title);
    }
    inner();
}
outter(); // coding everybody

내부함수는 외부함수의 지역변수에 접근할 수 있는데, 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도

내부함수가 외부함수의 변수에 접근할 수 있다. 이러한 메커니즘을 클로저라고 한다.

function outter(){
    var title = 'coding everybody';
    return function(){
        alert(title);
    }
}
inner = outter();
inner(); // coding everybody

inner = outter();에서 결과가 변수 inner에 담긴다. 그 결과는 이름 없는 함수이다.

실행이 inner();로 넘어오면 outter 함수는 실행이 끝났기 때문에 이 함수의 지역변수는 소멸되는 것이 자연스럽다.

결과값으로 coding everybody가 출력된 것은 외부함수의 지역변수 title에 소멸되지 않았음을 의미한다.

 

클로저란 내부함수가 외부함수의 지역변수에 접근할 수 있고,

외부함수는 외부함수의 지역변수를 사용하는 내부함수가 소멸될 때까지 소멸되지 않는 특성을 의미한다.

 

arguments

함수에는 arguments라는 변수에 담긴 숨겨진 유사 배열이 있다.

이 배열에는 함수를 호출할 때 입력한 인자가 담겨있다.

function sum(){
    var i, _sum = 0;
    for(i = 0, i < argumemts.length; i++){
        document.write(i+' : '+arguments[i]+'<br/>');
        _sum += arguments[i];
    }
    return _sum;
}
document.write('result : ' + sum(1,2,3,4)); // 10

sum()은 인자로 전달된 값을 모두 더해서 리턴하는 함수다.

인자에 대한 정의가 없는데 마지막에서 4개의 인자를 전달하고있다. arguments라는 특수 배열이 있기 때문에 가능하다.

 

arguments는 함수안에서 사용할 수 있도록 그 이름이나 특성이 약속되어 있는 일종의 배열이다.

argumemts[0]은 함수로 전달된 첫번째 인자를 알아낼 수 있다.

arguments.length로 함수에 전달된 인자의 개수를 알아낼 수도 있다.

여기에 반복문을 결합하면 함수로 전달된 인자의 값을 순차적으로 가져올 수 있고,

그 값을 더해서 리턴하면 총합을 구하는 함수가 된다.

 

매개변수의 개수

함수.length : 함수에 정의된 인자의 수

arguments.length : 함수에 전달된 실제 인자의 수

function zero(){
    console.log(
        'zero.length', zero.length,
        'arguments', arguments.lengtgh
    );
}
function one(arg1){
    console.log(
        'one.length', one.length,
        'arguments', arguments.length
    );
}
function two(arg1, arg2){
    console.log(
        'two.length', two.length,
        'arguments', arguments.length
    );
}
zero(); // zero.length 0 arguments 0
one('val1', 'val2'); // one.length 1 arguments 2
two('val1'); // two.length 2 arguments 1

 

함수 호출

기본적인 호출방법

function func(){
}
func();

위에서 함수 func는 Function이라는 객체의 인스턴스다.

따라서 func는 객체 Function이 가지고 있는 메소드들을 상속하고 있다. 

함수를 호출할 때 사용할 메소드는 Function.apply와 Function.call이다.

function sum(arg1, arg2){
    return arg1+arg2;
}
alert(sum.apply(null, [1,2])) // 3

apply 메소드는 두 개의 인자를 가진다.

첫 번째 인자는 함수가 실행될 맥락이다.

두 번째 인자는 배열이다. 이 배열에 담겨있는 원소가 함수의 인자로 순차적으로 대입된다.

o1 = {val1:1, val2:2, val3:3}
o2 = {v1:10, v2:50, v3:100, v4:25}
function sum(){
    var _sum = 0;
    for(name in this){
        _sum += this[name];
    }
    return _sum;
}
alert(sum.apply(o1)); // 6
alert(sum.apply(o2)); // 185

o1과 o2는 각각 3, 4개의 속성을 가지고 있다.

함수 sum은 객체의 속성을 열거 할 때 사용하는 for in 문을 이용해서 객체 자신(this)의 값을 열거한 후

각 속성의 값을 지역변수 _sum에 저장한 후 리턴한다.

 

 

 

 


참고사이트

https://www.opentutorials.org/course/743

 

'do > javascript' 카테고리의 다른 글

javascript 3  (0) 2019.04.29
javascript 1  (0) 2019.04.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함