Javascript – 알아두면좋은 상식 과 용어
strict 는 엄격한 이란 뜻으로 , 자바스크립트 코딩하는데 개발자에게 엄격함을강제한다.
“use strict” 또는 ‘use strict’ 로 선언하면 , 선언한 이 후 부터 모두 적용받는데,
만약에 특정 함수내에서만 또는 , 코드 일부 아래서만 적용하고싶다면 중간에 작성해도 선언 이후로 부터 효과 가 나타난다. (반드시 문장을 소문자로 작성해야함)
“USE STRICT” , “Use Strict” , “Use strict” 오류는 없으나 작동은 안됨
<script language=”javascript”>
a = 100; // 오류 안남 ,
‘use strict’ // strict 선언, strict 선언 이후로 모든 코드가 적용됨
b = 100; // 오류 발생 선언이 안되 발생 val1 is not defined
let c;
c = 100 // 정상처리 또는 var c , const c
</script>
<script language=”javascript”>
a = 100; // 오류 안남 ,
function myFunction()
{
b = 100 ; // 오류 안남 ,
‘use strict’ // 이후부터 엄격모드
c = 100; // not defined
}
– var 변수와 함수표현식에만 hoisting 이 일어난다.(O)
– let , const , 변수 할당등에는 hoisting 발생하지않음 (X)
일반적으로 , 프로그램에서 변수의 선언은 당연히 변수가 사용되기전에 선행되어야한다.
너무 당연한 이야기이다.
{
int a , b , c;
a = 1;
b = 2;
c = a + b;
console.write(c);
}
void main() // 비정상적인
{
a = 1; // 오류발생
b = 2;
c = a + b;
int a , b ,c ;
console.write(c);
}
문제는 javascript 에서는 저 비정상적인 코드가 정상적으로 실행이 된다.
javascript 소스로 보자.
<script language=”javascript”>
a = 1;
b = 2;
c = a + b;
var a , b, c; // hoisting 대상
console.log(c) // c 는,, 아주 정상적으로 3 을 출력함
</script>
더 신기한건 var a , b, c; 부분에서,
a,b,c 가 초기화 될꺼같은데 초기화 되지않음 —
바로 hoisting(호이스팅) 이 발생해서 인데 실제 js parser 가 스크립트내에
존재하는 선언(var 와 함수표현식)를 최상단 으로 끌어올려,
선언한 효과를 내도록한다.
아래는 위의 소스가 hoisting(호이스팅)이 발생한 후 소스이다.
<script language=”javascript”>
var a , b, c; // hoisting 이 발생하여 소스상단으로 이동한 상태
a = 1;
b = 2;
c = a + b;
console.log(c) // c 는,, 아주 정상적으로 3 을 출력함
</script>
<script language=”javascript”>
var a;
a = 10;
b = 20;
let c;
c = a + b;
var b;
</script>
<script language=”javascript”>
var a; // hoising 발생
var b;
a = 10;
b = 20;
let c; // let 은 hoisting 이 발생하지않음(X)
c = a + b;
</script>
일반변수 / 함수 표현식 / 화살표 함수
// 함수(Function) : 일반적인 함수 선언문
function myfunction() {
}
// 함수표현식(Function Expressions)
var myfunction = function() {
}
// 화살표 함수(Arrow Function)
var myFunction = () => {
~~ 여러줄 처리일 경우 return 이 필요하면 구현해줘야함
}
// 화살표 함수(Arrow Function) – 처리가 한 줄 일경우 자동 리턴포함★
var myFunction = (a,b) => a+b; // return a+b; 와 같음
// 화살표 함수 – 매개변수 있는
var myFunction = (p) => {
console.log(p)
}
// First Class Function
// 함수를 변수처럼 다루는것으로, 변수에 함수를 할당 할 수 있고,
// 변수에 함수를 담아 파라미터로 전달해서 함수로 실행 할 수 있는 기능
// 변수를 리턴하듯 함수자체를 리턴도 가능,,,,
var fn = function() { }); // 변수에 함수를 할당함
function testFn(f) // f 변수가 함수를 받음
{
f(); // 파리미터로 넘어온 변수(함수)를 함수로써 실행함
}
testFn(function() { console.log(“param funtion”); }); // 함수를 파리미터로 넘김
변수 선언 방식 이 차이
// 변수의 선언위치에 관계없이 변수가 사용이 가능해짐( hoisting 일어남)
// var a; 로 선언한 변수를 var a;로 또 선언해도 아무 문제가없음ㆍlet
// 반드시 선언 후 사용해야함 ,var 처럼 사용한후 선언하면 오류남(hoisting 안함)
// 선언한 변수를 또 선언 불가 (너무 당연함)ㆍconst
// 선언 후 변경이 불가능 한 상수가됨(선언시 반드시 초기화 해야됨)
const 는 다른 언어와 똑같고 , Typeless 한 javascript 에서는 데이터 타입에 따른 형식은 따로없다.Vanilla Javascript 사용시 ‘use strict’ 선언화 함께 let 이용을 대부분 추천함*
const myArray = [ 1, 2 ,3 , 4, 5 ];
myArray = [ 6,7,8,9,10] // const 선언과 함께 초기화 했기때문에 재할당은 오류남myArray[0] = 6; // 그런데. 이렇게 index 로 접근하면,, 수정이 가능함… —
myArray[1] = 7;
myArray[2] = 8;
myArray[3] = 9;
myArray[4] = 10;
특수한 변수가 값.
let a = null // null
let a; // undefined (초기화가 되어있지않음)
console.log(a) // not defined(선언 없이 변수를 사용할경우 선언되지 않음)
console.log(1/0) // infinity (무한대)
“abc” / 2 // NaN (숫자가 아닌 문자열을 숫자로 다룰때)
// ECMA6 함수 필수파라미터가 아닌경우 함수정의에서 기본값을 설정해줌
function myFuntion( name , address = ” ” , age = 0) { }
myFunction(“test”);
// Rest parameters
// ECMA6 함수의 파라미터가 배열형식경우 딱히 배열도 아니고,
function myFuntion( …names) { } // ‘.’ 세개와 변수명으로 파리미터를 설정함
myFunction(“test” , “test1” , “tes2” , “tes3”);
// 실제 [“test”,”test1″,”test2″,”test3″] 배열로 넘기면 안되고
// 그냥 파라미터를 여러개 넘기는데 받는 쪽에서 배열로 받음
// 다른언어의 string[] args 와 그냥 같은 느낌
사실 “비동기 함수 처리시” 처리가 끝나면, 부르는 함수의 의미로만 “Callback(콜백)” 이란 용어를 사용한다고 생각했었는데, “★비동기 처리던 , 동기 처리던” 함수처리가 끝나면 호출 되는 함수모두를 callback 함수로 라고한다.
sVal = 100;
function fnSuccess() { }
function fnFail() { };function process( sVal , f1, f2) // callback함수 전달 – first-class function
{ if (sVal > 100 )
f1(); // fnSuccess 콜백함수
else
f2(); // fnFail 콜백함수
}