Javascript 검색 결과

5개 발견
  1. 미리보기
    2020.04.07 - mr.november11

    [번역] 자바스크립트 예제로 배우는 함수형 프로그래밍

  2. 미리보기
    2019.12.05 - mr.november11

    타입스크립트(Typescript) 내용 정리

  3. 미리보기
    2018.07.07 - mr.november11

    [javascript ] javascript 로 form이나 element 값 얻어오거나 설정하기

  4. 미리보기
    2016.11.25 - mr.november11

    javascript에서 ajax로 외부 도메인 요청 시 Access-Control-Allow-Origin 에러가 발생하는 경우 해결법

  5. 미리보기
    2015.05.03 - mr.november11

    javascript로 타이머 구현하기

원문 : https://medium.com/@riteshkeswani/a-practical-introduction-to-functional-programming-javascript-ba5bee2369c2

Mary Rose Cook이 작성한 A practical introduction to functional programming을 기반으로 작성한 문서입니다. 원문의 파이썬 코드 대신 자바스크립트 코드 예제로 내용을 설명합니다.


함수형 프로그래밍은 사이드 이펙트(side effect)가 없다는 것이 특징입니다. 이는 함수 외부에 있는 데이터 의존하지 않으며, 함수 외부에 있는 데이터를 변경하지 않는 것을 의미합니다. ‘함수형'의 모든 것은 이러한 속성에서 파생된다는 점을 명심해야 합니다.

다음은 비 함수형 function의 예제입니다.

 

다음은 비 함수형 function의 예제입니다.

 

var a = 0;

function increment1() {
	return a += 1;
}
(역주 : increment1 함수가 외부 데이터 변수인 a 에 의존합니다.)

 

다음은 함수형 function의 예제입니다.

 

increment2(a) {
	return a + 1;
}

 

반복문 대신에 map과 reduce를 사용하십시오.

 

Map

 

map은 함수와 배열 원소를 사용합니다. 먼저 비어있는 배열을 새롭게 생성합니다. 원본 배열의 각 원소에 대해 함수를 실행하고 반환 값을 새로운 배열에 삽입합니다. 모든 과정이 끝나면 새로운 배열을 반환합니다.

아래의 비 함수형 코드는 이름의 배열을 임의로 할당된 코드명으로 변경합니다.

 

var names = [“Mary”, “Isla”, “Sam”];
var code_names = [“Mr. Pink”, “Mr. Orange”, “Mr. Blonde”];

for(var i in code_names) {
	var randomIndex = Math.floor(Math.random() * code_names.length); 
	var randomValue = code_names[randomIndex];
	names[i] = randomValue; 
}
(역주 : 실제 이름 리스트인 names를 반복문 수행 과정 내에서 직접 변경합니다.) 

console.log(names);
# => ["Mr. Blonde", "Mr. Pink", "Mr. Pink"]

 

위 코드를 for 반복문 대신 map 함수를 사용하면 다음과 같습니다.

 

var names = [“Mary”, “Isla”, “Sam”];
var code_names = [“Mr. Pink”, “Mr. Orange”, “Mr. Blonde”];

names = names.map(function(item) {
	var randomIndex = Math.floor(Math.random() * code_names.length); 
	var randomValue = code_names[randomIndex];
	return randomValue; 
});
(역주 : names에 대한 변경은 map 함수가 완료된 후 return 과정에서 이루어집니다.) 

console.log(names);
# => ["Mr. Orange", "Mr. Orange", "Mr. Blonde"]

 

Reduce

 

reduce 또한 함수와 배열 원소를 사용합니다. 각 원소를 조합하여 생성된 값을 반환합니다.

 

다음 예제는 ‘Sam’이라는 단어를 문자열 목록에서 찾아 카운트합니다.

 

var sentences = [
	‘Mary read a story to Sam and Isla’, 
	‘Isla cuddled Sam’, 
	‘Sam chortled’
];

var sam_count = 0;
for(var i in sentences) {
	var results = sentences[i].match(/Sam/g);
	if(results) {
		sam_count += results.length;
	}
}

console.log(sam_count);
# => 3

 

동일한 코드를 reduce로 작성하면 다음과 같습니다.

 

var sentences = [
	‘Mary read a story to Sam and Isla’, 
	‘Isla cuddled Sam’, 
	‘Sam chortled’
];

var sam_count = sentences.reduce(
	function(previousValue, currentValue) {
		var results = currentValue.match(/Sam/g);
		if(results) {
			previousValue += results.length;
		}
		return previousValue; 
	}, 
	0
);

console.log(sam_count);
# => 3

 

map과 reduce의 장점

 

  • 한 줄로 간단하게 처리할 수 있습니다.
  • map과 reduce에서는 반복에서 가장 중요한 부분인 배열, 연산, 반환 값이 항상 같은 위치에 있다.
  • 반복문의 코드는 이전에 선언된 변수에 영향을 미칠 수 있다. map과 reduce는 일반적으로 함수형으로 작동합니다.
    (역주 : map과 reduce는 함수형 프로그래밍 개념에 따라 기존 변수에 대한 사이드 이펙트가 없도록 구현하는 것이 원칙입니다.

  • map과 reduce는 원소 단위의 연산입니다. 반복문은 사람이 한 줄 단위로 로직을 읽고 이해해야 합니다. 반면에 map과 reduce는 복잡한 알고리즘과 원소의 추상적인 상태를 빠르게 이해할 수 있는 블록 단위의 코드를 제공합니다.

  • map과 reduce와 유사한 기능을 가진 다양한 함수(filter, all, any, find 등)가 있습니다.

명령형으로 작성하지 말고 선언형으로 작성하십시오.

아래 예제 프로그램은 세 대의 차량에서 레이스를 진행합니다. 각 단계에서 차량은 앞으로 이동하거나 정지합니다. 프로그램은 각 단계 별 차량의 위치를 출력합니다. 5단계가 진행된 후 레이스를 종료합니다.

 

레이스의 출력 결과는 다음과 같습니다.

 

-
--
--

--
--
---

---
--
---

----
---
----

----
----
-----

 

프로그램 코드는 다음과 같습니다.

 

var time = 5;
var car_positions = [1, 1, 1];

while(time > 0) { 
	time -= 1;
	console.log(‘’); 

	var carsCount = this.car_positions.length;
	for(var i=0; i<carsCount; i++) {
		if(Math.random() > 0.3) {
			this.car_positions[i] += 1;
		}

		var output_str = '- '.repeat(car_position);
		console.log(output_str);
	}
}

 

위 코드는 명령형으로 작성되었습니다. 함수형 프로그래밍은 선언형으로 코드를 작성합니다. 이는 어떻게 하는지에 대한 정의(how)가 아니라 무엇을 할 것인지 정의(what)합니다.

함수형 프로그램밍으로 구현하기

각 코드를 함수로 구현하여 프로그램을 선언형으로 작성할 수 있습니다.

 

function move_cars() {
	var carsCount = car_positions.length; 
	for(var i=0; i<carsCount; i++) {
		if(Math.random() > 0.3) {
			car_positions[i] += 1;
		}
	}
}

function draw_car(car_position) {
	var output_str = '- '.repeat(car_position);
	console.log(output_str);
}

function run_step_of_race() {
	this.time -= 1;
	move_cars(); 
}

function draw() {
	console.log(‘’);
	for(var i in car_positions) {
		draw_car(car_positions[i]);
	}
}

while(time > 0) {
	run_step_of_race();
	draw();
}

 

프로그램의 메인 루프는 다음과 같습니다.

 

“남은 시간이 있다면 레이스를 실행하고 출력합니다. 그리고 시간을 다시 확인합니다.” 각 레이스의 단계에 대해 더 자세히 알고 싶다면 구현된 함수를 읽으면 됩니다.

 

코드 자체가 내용을 설명하고 있기 때문에 주석을 추가하지 않아도 됩니다.

 

코드를 함수로 나누는 것은 코드를 더 읽기 쉽게 만들기 때문에 고민이 필요하지 않습니다.

 

위 코드는 함수를 사용하지만 외부 데이터(변수)에 의존적이기 때문에 함수형 프로그래밍의 조건을 만족하지 않습니다. 코드의 함수는 상태 값을 매개변수로 전달받아 사용하지 않습니다. 이러한 방식은 외부 변수의 변화에 의해 함수의 결괏값이 달라질 수 있습니다. 각 함수가 실제로 무엇을 하는지 확인하기 위해 정독이 필요합니다. 함수 내에서 외부 변수를 사용한다면 변수의 출처를 찾고 다른 함수에서 해당 변수를 변경하는지 확인해야 합니다.

 

상태 제거하기

 

자동차 레이스의 함수형 프로그래밍 버전은 다음과 같습니다.

 

function move_cars(car_positions) {
  return car_positions.map(function(item) {
    if(Math.random() > 0.3) {
      item += 1;
    }
    return item;
  });
}

function draw_car(car_position) {
  var output_str = ‘- ‘.repeat(car_position);
  console.log(output_str);
}

function run_step_of_race(state) {
  state[‘time’] -= 1;
  state[‘car_positions’] = move_cars(state[‘car_positions’]);
  return state; 
}

function draw(state) {
  console.log(‘’);
  state[‘car_positions’].map(function(item) {
    draw_car(item);
    return item;
  });
}

function race(state) {
  draw(state);
  if(state[‘time’] > 0) {
    state = run_step_of_race(state);
    race(state);
  }
}

race({
  ‘time’: 5,
  ‘car_positions’: [1, 1, 1] 
});

 

위 코드는 함수형 프로그래밍으로서 다음과 같은 특징을 갖습니다.

  • 공유 변수를 사용하지 않습니다. time과 car_positions는 race()로 전달됩니다.

  • 함수는 매개 변수를 사용합니다.

  • 함수 내에서 변수가 인스턴스화 되지 않습니다. 모든 데이터는 반환 값을 통해서 변경됩니다. race()는 run_step_of_race()의 결과와 함께 반복됩니다. 각 단계마다 새로운 상태가 생성되어 다음 단계로 전달됩니다.

파이프라인을 사용하십시오.

이전 섹션에서는 일부 명령형 반복문이 보조 함수를 호출하는 재귀 형태로 사용되었습니다. (역주 : race 함수 내에서 race를 다시 호출하는 재귀형 구조입니다.) 이번에는 파이프라인 기법을 활용하여 명령형 반복문을 다른 형태로 다시 작성해보겠습니다.

 

아래의 반복문은 밴드의 이름, 출신을 수정하는 역할을 수행합니다.
(역주 : 출신을 ‘Canada’로 수정하고 이름은 단어 단위로 제일 앞 문자를 대문자로 수정합니다.)

 

var bands = [
  {‘name’: ‘sunset rubdown’, ‘country’: ‘UK’, ‘active’: false},
  {‘name’: ‘women’, ‘country’: ‘Germany’, ‘active’: false},
  {‘name’: ‘a silver mt. zion’, ‘country’: ‘Spain’, ‘active’: true}
];

function format_bands(bands) {
  for (var i in bands) {
    bands[i][‘country’] = ‘Canada’;
    var name = bands[i][‘name’];
    name = name.replace(‘.’, ‘’);
    var nameParts = name.split(‘ ‘);
    for(var j in nameParts) { 
      nameParts[j] = nameParts[j].charAt(0).toUpperCase() +  nameParts[j].slice(1);
    }
    bands[i][‘name’] = nameParts.join(“ “);
  } 
}

format_bands(bands);

//print bands
console.log(JSON.stringify(bands));

 

위 코드 함수에서 ‘format’의 의미는 매우 애매모호합니다. 코드를 살펴보면 동일 반복문 안에서 세 가지 작업이 수행됩니다.

  • ‘country’ 키를 ‘Canada’로 설정합니다.
  • 구두점(.)을 밴드 이름에서 제거합니다.
  • 밴드 이름을 대문자로 변환합니다.

이는 코드가 의도한 바를 파악하기 어렵고 코드가 수행되는 상태를 파악하기 어렵습니다. 이러한 코드는 재사용하기 어렵고 테스트나 병렬 화도 어렵습니다.

다음과 비교해 보겠습니다.

 

pipeline_each(
  bands, 
  [set_canada_as_country, strip_punctuation_from_name, capitalize_names]
)

 

위 코드는 이해하기 더 쉽습니다. 각 기능이 서로 연관되어 있는 것처럼 보입니다. 이전 함수의 출력 결과는 다음 함수의 출력 결과로 입력됩니다. 각 함수가 함수형 프로그램의 특성을 갖고 있다면 재사용, 테스트, 병렬화가 용이합니다.

 

pipeline_each의 역할은 밴드를 set_canada_as_country()와 같은 변환 함수로 한 번에 하나씩 전달하는 것입니다. 함수가 모든 밴드에 적용된 후 pipeline_each는 변환된 밴드를 다음 함수로 전달합니다.

 

변환 함수를 살펴보겠습니다.

 

var set_canada_as_country = function set_canada_as_country(band) {
  band['country'] = "Canada";
  return band;
}

var strip_punctuation_from_name = function strip_punctuation_from_name(band) {
  band['name'] = band['name'].replace('.', '');
  return band;
}

var capitalize_names = function capitalize_names(band) {
  var nameParts = band['name'].split(‘ ‘);
  for(var j in nameParts) { 
    nameParts[j] = nameParts[j].charAt(0).toUpperCase() +  nameParts[j].slice(1);
  }
  band['name'] = nameParts.join(“ “);  
  return band;
}

 

pipeline_each 구현은 다음과 같습니다.

 

function pipeline_each(data, functions) {
  return functions.reduce(
    function(newData, currentFunction) {
      return newData.map(function(item) {
        return currentFunction.call(this, item);
      });
    }, 
    data
  ); 
}

bands = pipeline_each(
  bands, 
  [set_canada_as_country, strip_punctuation_from_name, capitalize_names]
);

console.log(JSON.stringify(bands));

Conclusion

함수형 프로그래밍은 ‘어떻게(how)’가 아니라 ‘무엇(what)’을 정의합니다. 이는 코드를 깔끔하게 추상화하여 나중에 쉽게 최적화할 수 있는 장점이 있습니다.

다른 카테고리의 글 목록

Javascript 카테고리의 포스트를 톺아봅니다

타입스크립트(Typescript) 내용 정리

2019. 12. 5. 23:55 - mr.november11

 

Typescript

 

초기 구축

npm 초기화

npm init --yes 

typescript 설치

npm install -g typescript

typescript 컴파일

tsc <NAME>.ts     // Default인 ES3로 컴파일 
tsc <NAME>.ts -t ES5 // ES5로 컴파일 

typescript 초기화 (tsconfig.json 생성)

  • tsconfig.json 파일 생성 후 tsc 명령어로 컴파일 실행
tsc --init

 

tsconfig.json 파일 noImplicitAny 설정 : 타입 선언이 없는 변수를 자동으로 any로 지정하는 설정

// hello.ts 

function add(a,b) {
    console.log(a+b)
}
  • noImplicitAny : false 일 경우 → 자동으로 any로 형태 변환함
~/study/typescript/hello2  tsc                                                                                                                                                                                    2 ↵  docker-desktop ⎈  19:15:49 
~/study/typescript/hello2 
  • noImplicitAny : true 일 경우 → 타입 선언이 없을 경우 에러 발생
~/study/typescript/hello2  tsc                                                                                                                                                                                    2 ↵  docker-desktop ⎈  19:14:57 
hello.ts:1:14 - error TS7006: Parameter 'a' implicitly has an 'any' type.

1 function add(a,b) {
               ~

hello.ts:1:16 - error TS7006: Parameter 'b' implicitly has an 'any' type.

1 function add(a,b) {
                 ~
Found 2 errors.

typescript 변수 정리

null vs undefined 비교

  • null은 값으로 인식되어 object 타입이 되기 때문에 사용하지 않는 것이 좋다. (undefined를 권장)
// null 자체는 비어있는 object type이 된다
// undefinded는 미할당되었기 때문에 undefinded 타입임
console.log(null === undefined)         // false : === 은 값 뿐만 아니라 type 까지 검사 하기 때문에 
console.log(null == undefined)          // true : 두 개의 값이 동일하게 없기 때문에 
console.log(undefined == undefined)     // true : 할당되지 않아 동일하기 때문에

typescript 함수 정리

기명 함수(이름을 지정한 함수)는 호이스팅 된다

  • 함수를 선언하기 전에도, 함수를 선언한 후에도 호출할 수 있다(like var 변수).

익명 함수를 지정하면 호이스팅 되지 않는다

  • 선언한 후에만 사용할 수 있다.
    resultMultiplication(1,2)  <- 익명함수이기 때문에 선언하기 전에 호출 불가 (컴파일 실패함) 
    let resultMultiplication = function (a,b) { return a * b }
    resultMultiplication(1,2)

Class 정리

생성자(constructor) 함수의 매개변수에 접근 제한자(public, private, protected)가 생략되면 생성자 내부에서만 접근 할 수 있다. 그러나 접근 제한자나 readonly가 붙으면 멤버 변수가 된다.

//typescript
constructor(defaultBalance: number = 0, protected bankName : string = "happy bank", 
                readonly interestRate : number = 0.1 ){

        this.balance = defaultBalance
    }
//javascript
class Account {
    constructor(defaultBalance = 0, bankName = "happy bank", interestRate = 0.1) {
        this.defaultBalance = defaultBalance;
        this.bankName = bankName;
        this.interestRate = interestRate;
        this.balance = defaultBalance;
    }

Module 정리

default 모듈과 일반 모듈을 import할 때 default 모듈은 이름만 선언하고 일반 모듈은 {} 내부에 모듈 이름을 선언해야 한다.

//default 모듈 import
import profile from './default'

// default, 일반 모듈 import 
import p, {hello} from './default2' 

Type casting 정리

1. + 연산자

// ts 코드
let myNum : any = "2017"
let num1 = +myNum

console.log(typeof myNum, myNum)
console.log(typeof num1, num1)

// 실행 결과 
string 2017
number 2017

2. parseInt 함수

// ts 코드
let myNum : any = "2017"
let num1 = parseInt(myNum)

console.log(typeof myNum, myNum)
console.log(typeof num1, num1)

let myNum2 : any = "2017년"
let num2 = parseInt(myNum2)

console.log(typeof myNum2, myNum2)
console.log(typeof num2, num2)

// 실행 결과
string 2017
number 2017
string 2017년
number 2017    <- parseInt 함수는 숫자에 여러 문자가 섞여 있어도 숫자만을 선택하여 반환한다 

3. Number 함수

// ts 코드
let myNum : any = "2017"
let num1 = parseInt(myNum)

console.log(typeof myNum, myNum)
console.log(typeof num1, num1)

let myNum2 : any = "2017년"
let num2 = Number(myNum2)

console.log(typeof myNum2, myNum2)
console.log(typeof num2, num2)

// 실행 결과
string 2017
number 2017
string 2017년
number NaN     <- Number 함수는 숫자와 문자가 섞여있을 경우 NaN을 반환한다 

RxJS를 활용한 데이터 스트림 처리

RxJS는 데이터 스트림에 대한 연산을 연산자(operator) 메서드를 이용해 연쇄적으로 처리한다.

  • 설치 방법
npm install @reactivex/rxjs@5.5.6 --save
  • 예제
// ts 코드
import * as rx from '@reactivex/rxjs'

rx.Observable.of("a", "b", "c").subscribe((v) => console.log(v))

// js 코드(ES5) 
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var rx = require("@reactivex/rxjs");
rx.Observable.of("a", "b", "c").subscribe(function (v) { return console.log(v); });

// 실행 결과
a
b
c

Async/Await (비동기 함수를 동기화하기)

async/await는 ES6(ES2015) 로 컴파일 해야한다.

호출하는 함수는 Promise 구문을 포함해 비동기 처리를 수행할 수 있어야 한다.

//ts
function delay2(msg : string) {
    let ms : number = Math.floor(Math.random() * 1000 + 1)
   
    return new Promise(function(resolve){
        setTimeout(resolve, ms, msg)
    }).then(function(v){
        console.log(v, ms+"ms")
    })
}

async function sync2(){
    await delay2("A")
    await delay2("B")
    await delay2("C")
}

sync2()

// 실행 결과
A 787ms
B 396ms
C 631ms

Javascript 라이브러리를 타입스크립트에서 사용하려면 *.d.ts 파일로 된 타입 정의 파일(type definition file)이 있어야 한다.

typescript 용 javascript 라이브러리 검색

webpack 번들링

webpack 설치

npm install -g webpack@3.11.0

// 실행 예제
webpack entry1.js build1.js

for문 대체 함수

map 함수

var names = ["Jack", "Jecci", "Ram", "Tom"];
var upperCaseNames = [];
for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) {
    upperCaseNames[i] = names[i].toUpperCase();
}

console.log(names)
console.log(upperCaseNames)


var names2 = ["Jack", "Jecci", "Ram", "Tom"];
var upperCaseNames2 = names.map(name => name.toUpperCase());

console.log(names2)
console.log(upperCaseNames2)

forEach 함수

function print(name) {
    console.log(name);
 }
 var names = ["Jack", "Jecci", "Ram", "Tom"];

 for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) {
     print(names[i])
 }

 names.forEach((name) => print(name) )

filter 함수

function isOdd(n) {
    return n %2;
 }
 var numbers = [1,2,3,4,5];
 var odd = [];
 for(let i=0, total = numbers.length; i< total ; i= i +1) {
    let number = numbers[i];
    if( isOdd(number) ) {
       odd.push(number);
    }
 }

 console.log(odd)

 var odd2 = numbers.filter(n => n % 2 )

reduce 함수

var numbers = [1,2,3,4,5]
var result = 0;
for(let i=0, total = numbers.length; i< total ; i= i +1) {
   result = result + numbers[i];
}

console.log(result)

var result2 = numbers.reduce((acc, val) => acc + val, 0)

console.log(result2)

다른 카테고리의 글 목록

Javascript 카테고리의 포스트를 톺아봅니다

[javascript ] javascript 로 form이나 element 값 얻어오거나 설정하기

javascript 코드를 통해 html 페이지에서 form 및 기타 element의 객체를 얻어오는 것이 가능하다.

객체를 얻은 후에는 해당 값을 얻어오거나 자유롭게 값을 수정할 수 있다.

얻고자하는 값이 form 형식이라면 form으로 접근하여 얻을 수 있다. 

 

document 활용

  • document.forms["<form이름>"].elements["<element이름>"]

    ex) document.forms["frm"].elements["name"];

 

getElementById, getElementsByName 활용

원하는 객체의 Id나 Name을 알고 있다면 아래 함수를 통해 바로 객체를 얻어올 수 있다.

  • document.getElementById("<#id>");
  • document.getElementsByName("<#name>");

객체를 얻어온 후에는 javascript reference를 참고하여 원하는 값을 출력하거나 설정하면 된다. 

http://www.w3schools.com/jsref/dom_obj_all.asp

text 타입의 input객체를 얻어왔을 경우 아래1 property를 활용하면 된다.

input text 내의 값은 value 항목을 활용한다.

 

활용 예제 : FootLock 제품 페이지 내 객체 얻기

 

  • FootLocker 사이트 내 객체 얻기


 

 

Input Text Object Properties


PropertyDescription
autocompleteSets or returns the value of the autocomplete attribute of a text field
autofocusSets or returns whether a text field should automatically get focus when the page loads
defaultValueSets or returns the default value of a text field
disabledSets or returns whether the text field is disabled, or not
formReturns a reference to the form that contains the text field
listReturns a reference to the datalist that contains the text field
maxLengthSets or returns the value of the maxlength attribute of a text field
nameSets or returns the value of the name attribute of a text field
patternSets or returns the value of the pattern attribute of a text field
placeholderSets or returns the value of the placeholder attribute of a text field
readOnlySets or returns whether a text field is read-only, or not
requiredSets or returns whether the text field must be filled out before submitting a form
sizeSets or returns the value of the size attribute of a text field
typeReturns which type of form element a text field is
valueSets or returns the value of the value attribute of the text field

 


1 Input Text Object Properties


다른 카테고리의 글 목록

Javascript 카테고리의 포스트를 톺아봅니다

아래 메시지가 발생하는 경우 


No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ‘[요청한 도메인]' is therefore not allowed access.


이 경우 요청 페이지와 ajax에서 가져온 도메인이 다르기 때문에 보안 표준의 의해 질의가 거부된다.


해당 방법은 요청 클라이언트의 크롬에서의 플러그인 설치로 쉽게 해결된다.


자체적인 관리 페이지를 사용할 것이라면 아래 방법으로 쉽게 해결 가능하다.


https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi/related?utm_source=chrome-ntp-icon

다른 카테고리의 글 목록

Javascript 카테고리의 포스트를 톺아봅니다

javascript로 타이머 구현하기

2015. 5. 3. 21:31 - mr.november11

[javascript] javascript로 타이머 구현하기


자바스크립트로 타이머를 구현하려면 

setInterval 함수를 사용하면 된다. 


레퍼런스 : http://www.w3schools.com/jsref/met_win_setinterval.asp

Syntax

setInterval(function,milliseconds,param1,param2,...)

setInterval의 첫번째 파라미터는 정해진 시간마다 실행될 callback 함수이다. 함수를 선언한 후 해당 함수의 이름을 첫번째로 지정한다.

두 번째 파라미터는 특정 함수가 반복될 시간 설정이다. 밀리 세컨드 단위로 3초일 경우 3000을 입력하면 된다. 
나머지 param1, param2도 있는데 자주 사용하지 않는 파라미터다. 굳이 사용할 필요없다.

Parameter Values

ParameterDescription
functionRequired. The function that will be executed
millisecondsRequired. The intervals (in milliseconds) on how often to execute the code
param1,param2,...Optional. Additional parameters to pass to the function (Not supported in IE9 and earlier)


예제코드 

0.3초 단위로 setColor라는 함수를 실행한다. setColor 함수는 매초마다 현재 페이지의 배경 색상을 노랑, 핑크 색상으로 변경한다. 

함수 중지는 setInterval의 객체를 갖고 있는 myVar 변수를 clearInterval에 입력하여 실행하면 중지된다. 


var myVar = setInterval(function(){ setColor() }, 300);

function setColor() {
    var x = document.body;
    x.style.backgroundColor = x.style.backgroundColor == "yellow" ? "pink" : "yellow";
}

function stopColor() {
    clearInterval(myVar);
}

다른 카테고리의 글 목록

Javascript 카테고리의 포스트를 톺아봅니다