함수만들기

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
// ---------------------------
// 함수 선언문 방식으로 함수 만들기
function sub1(x, y) {
	var s = x + y;
	return s;
}

// 함수 호출
var result;
result = sub1(10, 5);
console.log(result);

//---------------------------
// 함수 표현식 방법으로 함수 만들기
var sub2 = function(x, y) { // 익명 함수
	return x * y;
}

var multiply = sub2;
result = sub2(10, 5);
console.log(result);

result = multiply(3, 5);
console.log(result);

//---------------------------
// 기명 함수 표현식 방법으로 함수 만들기
var sub3 = function add(x, y) {
	return x + y;
};

console.log(sub3(15, 5));
// console.log(add(15, 5)); // Error -> add is not defined
		// 함수 표현식에서 사용한 함수 이름은 외부 코드에서 접근 불가

// 기명 함수 표현식을 이용한 재귀호출
var sub4 = function sum(n) {
	return n > 1 ? n+ sum(n-1) : n;
}

console.log(sub4(10)); // 55

//---------------------------
// Function() 생성자를 이용한 함수 만들기
var sub5 = new Function('x', 'y', 'return x+y;');
console.log( sub5(7,8) ); //15

//---------------------------
// 즉시 실행 함수 - 정의함과 동시에 함수를 바로 실행
var a = (function(a, b) {
	return a+b;
})(5, 7);
console.log(a);

(function(a, b){
	var c = a + b;
	console.log(c);
})(3, 5);

</script>
</head>
<body>

<h3> 함수</h3>

</body>
</html>

 

함수 표현식에서의 함수 호이스팅은 불가

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
// --------------------------------
// 함수 선언문에서의 함수 호이스팅(선언전 호출)
console.log( sub1(5, 10) );

function sub1(a, b) {
	return a+b;
}

//--------------------------------
// 함수 표현식에서의 함수 호이스팅은 불가능하다.
// console.log( sub2(3, 5) ); // 에러 - Uncaught TypeError: sub2 is not a function

var sub2 = function (a, b) {
	return a+b;
}
console.log( sub2(3, 5) );

// 페이지 실행시 호출하는 콜백 함수
window.onload = function() {
	alert("반가워요...");
};
</script>
</head>
<body>

<h3>함수</h3>

</body>
</html>

 

함수의 매개변수

- 매개변수는 함수를 호출한 곳에서 함수에 값을 전달 할 때 사용한다.

- 매개 변수를 선언할 때 var 키워드는 사용하지 않는다.

- 자바 스크립트 함수를 정의할 때 매개 변수의 데이터 유형을 지정하지 않으며, 전달된 인수에 대하여 유형 검사를 하지 않는다.

- 자바 스크립트는 넘겨 받은 매개 변수의 수를 확인하지 않는다.

- 함수에서 값 전달 방식은 passing by value방식이다. 즉, 함수가 인수의 값을 변경해도 매개 변수의 원래 값은 변경되지 않는다. 

- 자바 스크립트는 디폴트 매개변수와 Rest 매개 변수 등을 지원한다.

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">

<script type="text/javascript">
function sub1(a, b) {
	console.log(a, b);
}
sub1(); // undefined undefined
sub1(1); // 1 undefined
sub1(1, 2); // 1 2
sub1(1, 2, 3); // 1 2
console.log("-----------------");

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

sub2("홍길동", "자바", 100);

console.log("-----------------");
function sub3(name) {
	console.log("name:" + name);
	for(var i = 1; i < sub3.arguments.length; i++) {
		console.log(sub3.arguments[i]);
	}
}
sub3("김자바", "스프링", 95);

</script>

</head>
<body>

<h3>함수 - 매개변수</h3>

</body>
</html>

arguments 객체

- arguments 객체는 함수를 호출할 때 전달된 인자 값을 나타내며, 첫 번째 인자는 arguments[0]으로 나타낸다.

- arguments.length는 함수에 실제로 넘겨받은 인수의 개수를 반환한다.

- arguments는 배열과 유사하게 인덱스로 접근할 수 있지만 배열은 아니며, 배열을 다루는 메소드가 없다.

 

디폴트 매개 변수(default parameters)

- 자바스크립트에서 함수의 매개변수는 undefined가 기본으로 설정된다.

- 자바스크립트에서 함수의 매개변수에 디폴트 매개 변수 값을 설정 할 수 있다.

- ES 2015 스펙에 추가

 

Rest 매개 변수

- Rest 파라미터 구문은 정해지지 않은 수의 인수를 배열로 나타낼 수 있다.

- 함수의 마지막 파라미터의 앞에 ...를 붙여 모든 나머지 인수를 "표준"자바스크립트 배열로 대체한다.

- 마지막 파라미터만 "Rest 파라미터"가 될 수 있다.

- argumnets 객체는 실제 배열이 아니지만, Rest 파라미터는 Array 인스턴스로, sort, map, forEach 또는 pop 같은 메소드가 바로 인스턴스에 적용될 수 있다.

- ES 2015 스펙에 추가

 

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
// 디폴트 매개 변수

function add1(a, b) {
	return a + b;
}
console.log( add1(10) ); // 10 + undefined => NaN

function add2(a, b) {
	b = typeof b !== 'undefined' ? b : 0;
	return a + b;
}
console.log( add2(10) ); // 10

// 디폴트 매개 변수(ES 2015)
function add3(a, b = 0) {
	return a + b;
}
console.log( add3(10) ); 

function sub(x = 1, y) {
	console.log(x, y);
}
sub(); // 1 undefined

// Rest 매개 변수(부정 인수) 마지막 파라미터만 Rest 매개변수가 가능
// Rest 매개 변수는 배열로 나타낼 수 있다.
function add4(...args) {
	var s = 0;
	for(var n = 0; n < args.length; n++) {
		s += args[n];
	}
	return s;
}
console.log( add4(1,2,3,4,5)); // 15

</script>


</head>
<body>

<h3>함수 - 매개변수</h3>


</body>
</html>

 

클로저(Closures)

- 함수 내부에 함수를 작성할 때마다 클로저를 생성한다. 즉, 함수 내부에 작성된 함수가 바로 클로저이다.

- 내부함수는 외부함수 안에서 정의된 모든 변수와 함수를 접근 할 수 있다.

- 내부함수는 외부함수의 명령문에서만 접근할 수 있다.

- 외부함수는 내부함수 안에서 정의된 변수와 함수들에 접근 할 수 없다. 이는 내부함수의 변수에 대한 일종의 캡슐화를 제공한다.

- 내부함수는 외부함수의 지역변수에 접근 할 수 있는데 외부함수의 실행이 끝나서 외부함수가 소멸된 이후에도 내부함수가 외부함수의 변수에 접근 할 수 있다. 이러한 메커니즘을 클로저 라고 한다. 

 

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
function fun(x) { // 외부함수
	var n = 10;
	
	// 내부함수(closure)
	function sub(y) {
		return n+x+y; // 외부 함수의 변수나 인수 접근 가능
	}
	
	return sub(3); // 외부 함수에서 내부 함수 접근 
}

console.log( fun(2)); // 15

// ------------------------
function fun2(x) {
	function sub2(y) {
		return x + y;
	}
	
	return sub2;
}

var f = fun2(2); // 함수 객체를 반환
var n = f(3);
console.log(n); // 5

n = fun2(10)(5);
console.log(n); // 15

</script>
</head>
<body>

<h3>함수 - closures : 함수 내부에 작성된 함수</h3>

</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
var seq = function() {
	var n = 0;
	return function() {
		return ++n;
	}
}

var fn = seq();
console.log( fn() ); // 1
console.log( fn() ); // 2
console.log( fn() ); // 3

</script>
</head>
<body>

<h3>함수 - closures : 함수 내부에 작성된 함수</h3>

</body>
</html>

 

DOM(Document Object Model)을 포함한 브라우저의 창을 나타내는 객체는 window 객체이며, document 속성은 브라우저 창에 로드된 DOM 문서를 나타낸다.

window 객체는 브라우저 기반 자바스크립트의 최상위 객체이다.

window 객체는 전역 객체(Global Object)라고도 불리며, 전역 객체는 그 객체의 프로퍼티나 메소드를 사용할 때 그 이름을 명시할 필요가 없다.

window 객체에는 타이머, 자바스크립트 경고 창 및 입력 대화상자를 위한 메소드가 정의되어 있다.


타이머 함수 - 특정한 시간에 특정한 함수를 실행하는 함수로 window 객체에 정의되어 있다.

setTimeout(function, millisecond) - 일정 시간 후 함수를 한 번 실행

setInterval(function, millisecond) - 일정 시간마다 함수를 반복 실행

clearTimeout(id) - 일정 시간 후 함수를 한 번 실행하는 것을 중지

clearInterval(id) - 일정 시간마다 함수를 반복하는 것을 중단

 

타이머함수예제

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">document.write("<h3>타이머 함수 예제</h3>");

function sub() {
	document.write("<p>자바 스크립트</p>");
}

setTimeout("alert('환영합니다. !!!')", 3000); // 3초 후에 한번 실행

setInterval("sub();", 2000); // 2초에 한번씩 무한 반복</script>
</head>
<body>


</body>
</html>

실행하면 3초후에 alert이 나타난다.

2초마다 자바스크립트를 화면에 출력하는 것을 무한 반복한다.

 

타이머 종료

더보기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
var n = 0;

function sub() {
	n++;
	document.write("<p>숫자 : " + n + "</p>");
}

var timer = setInterval("sub();", 1000); // 1초에 한번씩 무한반 복

setTimeout(function() {
	clearInterval(timer); // 타이머 종료 // 익명 함수 1회성
}, 10000); // 10초 후 한번 실행 


</script>
</head>
<body>

<h3>타이머 - 타이머 종료</h3>

</body>
</html>

1초에 한번씩 숫자가 화면에 출력되고 

10초 후에 타이머가 종료된다.

 

인코딩 : 문자를 컴퓨터에 저장 또는 통신에 사용할 목적으로 부호화하는 방법

디코딩 : 부호화된 문자를 원래대로 되돌리는 것

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
var s = "seoul?자바&123+4";
var out;

out = escape(s); // 영문자, 숫자, 일부특수문자(@ * - _ + . /)를 제외한 문자 인코딩
console.log("escape : " + out); // seoul%3F%uC790%uBC14%26123+4

out = encodeURI(s); 
	// 영문자, 숫자, 인터넷 주소에 사용하는 일부 특수문자(: / = + & ? ....) 를 제외한 문자를 주소형식으로 인코딩
console.log("encodeURI : " + out); // seoul?%EC%9E%90%EB%B0%94&123+4

out = encodeURIComponent(s); // 영문자, 숫자를 제외한 문자를 인코딩
console.log("encodeURIComponent : " + out); 
	// seoul%3F%EC%9E%90%EB%B0%94%26123%2B4

out = decodeURIComponent(out); // 디코딩
console.log(out);

	
</script>

</head>
<body>

<h3>인코딩과 디코딩</h3>

</body>
</html>

문자열을 코드로 실행 할 수 있는 특별한 함수

eval() 함수로 실행 된 코드에서 정의한 변수도 활용 가능

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
var s;
s = "var a=10, b=5, c;";
s += "c = a + b;";
s += "alert(c);";

// console.log(s);

// 문자열을 코드로 실행
eval(s);

s = "console.log(c);";
eval(s); // eval() 함수로 호출한 코드의 변수를 사용

</script>
</head>
<body>

<h3>문자열을 자바스크립트 코드로 실행 - eval() 함수</h3>

</body>
</html>

 

isFinite(testValue) : number가 무한한 값인지 확인, 유한한 수이면 true를 리턴

isNaN(testValue) : number가 숫자인지 확인, 숫자가 아니면 true를 리턴

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
var a, b;

a = "123";
b = isFinite(a); // true. 숫자로 이루어져 있는 경우 true
console.log(a + " : " + b);

a = "123.57";
b = isFinite(a); // true
console.log(a + " : " + b);

a = "1,234";
b = isFinite(a); // false. , 가 있어서 false
console.log(a + " : " + b);

a = "123a";
b = isFinite(a); // false
console.log(a + " : " + b);

a = "123";
b = isNaN(a); // false 숫자로 이루어져 있지 않으면 true
console.log(a + " : " + b);

a = "1,234";
b = isNaN(a); // true
console.log(a + " : " + b);

</script>
</head>
<body>

<h3>문자열이 숫자로 이루어져 있는지 확인</h3>

</body>
</html>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
var a, b;

a = "123";
b = Number(a);
console.log(b); // 123
console.log( b === 123); // true

a = "123.57";
b = Number(a); // 123.57
console.log(a + " : " + b); //123.57 : 123.57

a = "1,234";
b = Number(a); // NaN
console.log(a + " : " + b); // 1,234 : NaN

a = "123a";
b = Number(a); // NaN
console.log(a + " : " + b); // 123a : NaN

a = "";
b = Number(a); // 0
console.log(a + " : " + b); //  : 0

a = null;
b = Number(a); // 0
console.log(a + " : " + b); // null : 0

a = "kor";
b = Number(a); // NaN
console.log(a + " : " + b); // kor : NaN

a = "0x11";
b = Number(a); // 17
console.log(a + " : " + b); // 0x11 : 17

</script>


</head>
<body>

<h3>숫자로 변환 - Number() 함수</h3>

</body>
</html>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<script type="text/javascript">
var a, b;

a = "123";
console.log(a === 123); // false 

b = parseInt(a); // 문자열을 숫자로 변환
console.log(b); // 123
console.log(b === 123); // true

a = "1,234";
b = parseInt(a); // 1
console.log(a + " : " + b); // 1,234 : 1

a = "123a";
b = parseInt(a); // 123
console.log(a + " : " + b); // 123a : 123

a = "a123";
b = parseInt(a); // NaN
console.log(a + " : " + b); // a123 : NaN

a = "123.567";
b = parseInt(a); // 123
console.log(a + " : " + b); // 123.567 : 123

a = "";
b = parseInt(a); // NaN
console.log(a + " : " + b); //  : NaN

a = "     123";
b = parseInt(a); // 123
console.log(a + " : " + b); //      123 : 123

a = "1 2 3";
b = parseInt(a); // 1
console.log(a + " : " + b); // 1 2 3 : 1

a = "123.567";
b = parseFloat(a); // 123.567
console.log(a + " : " + b); //123.567 : 123.567


</script>
</head>
<body>

<h3>숫자로 변환 - parseInt, parseFloat</h3>

</body>
</html>

+ Recent posts