반응형


javascript 에서 지역 변수는 함수 안에서 선언된 변수만이 지역변수가 된다


그래서 i 와 name 은 전역변수가 된다! ( 함수범위 내에서 선언된 변수만이 지역변수로 생성된다)


1
2
3
4
5
6
7
8
9
10
11
12
 
for (var i = 0; i < 1; i++) {
 
    var name = '11111111111111111111';
 
}
 
console.log(name);
 
console.log(i);
 
 




스크립트 언어는 아무래도 편의성을 위해 제공되는 측면이 있다보니


이런 변수가 전역 변수가 된다는 것은 다른 언어 C++, C# 들과는 확연히 다른 부분들이다




반응형
반응형

typeof 연산자(JavaScript)

 

식의 데이터 형식을 나타내는 문자열을 반환합니다.


expression 인수는 형식 정보를 찾은 식입니다.

typeof 연산자는 형식 정보를 문자열로 반환합니다. typeof"number", "string", "boolean", "object", "function",  "undefined"의 6가지 값을 반환할 수 있습니다.

typeof 구문에서 괄호는 선택 사항입니다.

다음 예제에서는 변수의 데이터 형식을 테스트합니다.

1
2
3
4
5
6
7
var index = 5;
var result = (typeof index === 'number');
// Output: true
 
var description = "abc";
var result = (typeof description === 'string');
// Output: true




다음 예제에서는 선언된 변수와 선언되지 않은 변수의 undefined 데이터 형식을 테스트합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var declared;
var result = (declared === undefined);
// Output: true
 
var result = (typeof declared === 'undefined');
// Output: true
 
var result = (typeof notDeclared === 'undefined')
// Output: true
 
var obj = {};
var result = (typeof obj.propNotDeclared === 'undefined');
// Output: true
 
// An undeclared variable cannot be used in a comparison without
// the typeof operator, so the next line generates an error.
//  var result = (notDeclared === undefined);
cs



ref : https://msdn.microsoft.com/ko-kr/library/259s7zc1(v=vs.94).aspx



반응형
반응형
var 변수에 아무것도 대입하지 않고 선언만 하면 이 변수는 undefined 가 된다(정의 자체가 되지 않았다는 뜻)

그렇지만 null 을 대입하게 되면 이변수는 null 값을 담게 된다(아무것도 참조 하지 않는다 라는 뜻)


그런데 undefined 이든 null 을 갖고 있는 변수든 다음 행에 정수 값을 대입하면 이 변수의 타입은 number 가 된다


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
32
33
// A variable that has not been initialized.
 
 
var ss ;
console.log("typeof ss is " + typeof (ss));
 
var ss1 = null;
console.log("typeof ss1 is " + typeof (ss1));
 
 
 
 
var declared;
 
if (declared == undefined)
    console.log("declared 는 값이 주어지지 않았다");
else
    console.log("declared 는 값이 주어졌다");
 
console.log("typeof declared is " + typeof (declared));
 
// An undeclared variable cannot be compared to undefined,
// so the next line would generate an error.
// if (notDeclared == undefined);
 
console.log("typeof notDeclared is " + typeof (notDeclared));
 
 
 
// Output:
// declared has not been given a value
// typeof declared is undefined
// typeof notDeclared is undefined
cs




결과 화면





undefined 상수(JavaScript)

 

초기화되지 않은 변수와 같이 정의되지 않은 값입니다.

undefined 상수는 Global 개체의 멤버이고 스크립팅 엔진이 초기화되면 사용할 수 있습니다.변수가 초기화되지 않고 선언되면 그 값은 undefined입니다.

변수가 선언되지 않으면 undefined와 비교할 수 없지만 변수 유형은 문자열 "undefined"와 비교할 수 있습니다.

undefined 상수는 변수를 명시적으로 테스트하거나 undefined로 설정할 경우 유용합니다.

다음 예제에서는 undefined 상수를 사용하는 방법을 보여 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// A variable that has not been initialized.
var declared;
 
if (declared == undefined)
    document.write("declared has not been given a value <br/>");
else
    document.write("declared has been given a value <br/>");
 
document.write("typeof declared is " + typeof(declared) + "<br/>");
 
// An undeclared variable cannot be compared to undefined,
// so the next line would generate an error.
// if (notDeclared == undefined);
 
document.write("typeof notDeclared is " + typeof(notDeclared));
 
// Output:
// declared has not been given a value
// typeof declared is undefined
// typeof notDeclared is undefined



요구 사항

undefined 속성은 Internet Explorer(Internet Explorer 6보다 오래된 버전)에 도입되었고 Internet Explorer 9 표준 모드에서는 읽기 전용으로 만들어졌습니다.




null은 변수가 유효한 데이터를 참조하지 않음을 나타내는 데 사용됩니다. undefined 상수(JavaScript)과는 다릅니다.



ref : https://msdn.microsoft.com/ko-kr/library/fhcc96d6(v=vs.94).aspx

ref : https://msdn.microsoft.com/ko-kr/library/dae3sbk5(v=vs.94).aspx





반응형
반응형

즉시 실행함수는 함수 형태를 만든다음 ( ) 묶고 바로 인자를 (2) 호출하는 구문을 붙여 주면 즉시 실행 되는 javascript 에서

제공하는 사용되는 함수를 말한다, 익명함수(람다 같은) 또한 마찬가지로 즉시 실행 시킬 수 있다



(function square(x) {
    console.log(x*x);
})  (2);     //즉시 실행 결과 4
 
(function square(x) {
    console.log(x*x);
(2));    //즉시 실행 결과 4




.js 페이지의 함수가 아닌 부분에 선언된 전역변수를 이런 즉시 실행 함수로 묶게 되면 전역변수를 사용하지 않는 형태가 되면서 즉시 실행 함수

내에서 객체를 사용하고 해당 기능만 처리하는 지역변수 형태가 될 수 있다





전역변수를 사용하고 싶지 않다면 아래와 같이 익명함수를 호출함으로서 이러한 목적을 달성할 수 있다.

(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());

}())








함수(Function)


1. 함수 선언(Function declaration 혹은 Function statement)

함수 선언(Function declaration)을 MDS에서 밑에와 같이 정의 하였습니다.


문법

1
2
3
function name([param,[, param,[..., param]]]) {
   [statements]
}

name

The function name.


param

The name of an argument to be passed to the function. Maximum number of arguments varies in different engines.


statements

3

     The statements which comprise the body of the function.

0


함수 선언 호이스팅(Function declaration hoisting)

함수 선언은 호이스팅이 됩니다. ([JavaScript] 유효범위(Scope)와 호이스팅(Hoisting) 참고)

1
2
3
4
5
hoisted(); // logs "foo"
 
function hoisted() {
  console.log("foo");
}

함수 선언 호이스팅함수 선언 호이스팅


알게 모르게 저희는 함수 선언 호이스팅을 사용하고 있었습니다. 함수는 호출 먼서 하고, 함수 정의는 나중에 정의하는..


하지만, 다음으로 이야기할 함수 표현은 호이스팅이 되지 않습니다.

1
2
3
4
5
notHoisted(); // TypeError: notHoisted is not a function
 
var notHoisted = function() {
   console.log("bar");
};

함수 표현은 호이스팅이 되지 않는다함수 표현은 호이스팅이 되지 않는다


호이스팅된 코드를 보면 이해하기 쉽습니다.

1
2
3
4
5
6
7
var notHoisted;
 
notHoisted(); // TypeError: notHoisted is not a function
 
notHoisted = function() {
   console.log("bar");
};

정의 되어 있지 않는 변수를 사용하려 하여 에러가 출력되는 것은 당연합니다.



2. 함수 표현(Function expression)

함수 표현(Function expression)을 MDS에서 밑에와 같이 정의 하였습니다.


문법

1
2
3
function [name]([param1[, param2[, ..., paramN]]]) {
   statements
}

name

The function name. Can be omitted, in which case the function is anonymous. The name is only local to the function body.


paramN

The name of an argument to be passed to the function.


statements

The statements which comprise the body of the function.


익명 함수 표현 (Anonymous function expression)

익명 함수 표현의 예를 들어보겠습니다.

1
2
3
4
var x = function(y) {
   return y * y;
};
console.log(x(2)); // 4

익명 함수 표현익명 함수 표현


기명 함수 표현 (Named function expression)

기명 함수 표현의 예를 들어보겠습니다.

1
2
3
4
var x = function square(y) {
   return y * y;
};
console.log(x(2)); // 4

기명 함수 표현기명 함수 표현


여기서 저는 궁금한 점이 하나 생겼습니다. 기명 함수 표현으로 함수의 이름이 있다면 함수 이름으로 함수 실행이 가능 할까..?

1
2
3
4
var x = function square(y) {
   return y * y;
};
square(2);

기명 함수 표현함수이름으로 함수 실행이 되지 않는다


안됩니다.... 그렇다면, 왜 기명 함수 표현을 사용하는 걸까요?


One of the benefit of creating a named function expression is that in case we encounted an error,

the stack trace will contain the name of the function, making it easier to find the origin of the error.


MDS에서는, 장점 하나는 에러가 발생 했을 때, stack trace가 함수의 이름을 포함하여 출력하기 때문에 에러를 찾기 쉽운것이 기명 함수 표현의 장점이라고 이야기 함니다.


MDS에서 함수 정의에 몇가지 방법을 더 이야기 하는데, 이번 포스팅에서 2가지만 이야기하겠습니다.

(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions 참고)



즉시 실행 함수 (Immediately-invoked function expression)



즉시 실행 함수의 기본 형태는 아래와 같습니다.

1
2
3
(function () {
    // statements
})()

함수 표현(Function expression)은 함수를 정의하고, 변수에 함수를 저장하고 실행하는 과정을 거칩니다. 하지만 즉시 실행 함수는 함수를 정의하고 바로 실행하여 이러한 과정을 거치지 않는 특징이 있습니다. 함수를 정의하자마자 바로 호출하는 것을 즉시 실행 함수라고 이해하면 편할 것 같습니다.


Immediately-invoked function expression 영어를 해석하면 즉시-호출 함수 표현 입니다. 즉시 실행 함수(IIFE)는 함수 표현(function expression)과 같이 익명 함수 표현, 기명 함수 표현으로 할 수 있습니다.



1. 즉시 실행 함수 사용법

기명 즉시 실행 함수

1
2
3
4
5
6
7
(function square(x) {
    console.log(x*x);
})(2);
 
(function square(x) {
    console.log(x*x);
}(2));

위의 두가지 예는 괄호의 위치가 조금 다를 뿐 같은 기능의 즉시 실행 함수 입니다.


익명 즉시 실행 함수

1
2
3
4
5
6
7
(function (x) {
    console.log(x*x);
})(2);
 
(function (x) {
    console.log(x*x);
}(2));


변수에 즉시 실행 함수 저장

즉시 실행 함수도 함수이기 때문에, 변수에 즉시 실행 함수 저장이 가능합니다. 예를 들어 보겠습니다.

1
2
3
4
(mySquare = function (x) {
    console.log(x*x);
})(2);
mySquare(3);

변수에 즉시 실행 함수 저장변수에 즉시 실행 함수 저장


함수를 mySquare에 저장하고 이 함수를 바로 실행하게 됩니다. mySquare는 즉시 실행 함수를 저장하고 있기 때문에 재호출이 가능하게 됩니다.


마찬가지로 즉시 실행 함수도 함수이기 때문에, 변수에 즉시 실행 함수의 리턴 값 저장도 가능합니다.

1
2
3
4
var mySquare = (function (x) {
    return x*x;
})(2);
console.log(mySquare)

변수에 즉시실행함수 리턴값 저장변수에 즉시실행함수 리턴값 저장


위의 두가지는 형태가 유사하지만 엄연히 다른 기능입니다. 괄호의 위치에 주의가 필요할 것 같습니다.



2. 즉시 실행 함수를 사용하는 이유

초기화

즉시 실행 함수는 한 번의 실행만 필요로 하는 초기화 코드 부분에 많이 사용됩니다.

그렇다면 왜 초기화 코드 부분에 많이 사용 할까요? 변수를 전역(global scope)으로 선언하는 것을 피하기 위해서 입니다. 전역에 변수를 추가하지 않아도 되기 때문에 코드 충돌 없이 구현 할 수 있어, 플러그인이나 라이브러리 등을 만들 때 많이 사용됩니다.


예를 하나 들어보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
var initText;
 
(function (number) {
    var textList = ["is Odd Text", "is Even Text"];
    if (number % 2 == 0) {
        initText = textList[1];
    } else {
        initText = textList[0];
    }
})(5);
 
console.log(initText);
console.log(textList);

즉시실행함수 이용한 초기화즉시실행함수 이용한 초기화



전역에 textList가 저장되지 않고, initText만 초기화 된 것을 확인 할 수 있습니다. 또한 textList는 지역 변수로, 전역 변수와 충돌없이 초기화 할 수 있게 됩니다.


라이브러리 전역 변수의 충돌

jQuery나 Prototype 라이브러리는 동일한 $라는 전역 변수를 사용합니다. 만약, 이 두개의 라이브러리를 같이 사용한다면 $ 변수 충돌이 생기게 됩니다.

즉시 실행 함수를 사용하여 $ 전역 변수의 충돌을 피할 수 있습니다.

1
2
3
(function ($) {
    // $ 는 jQuery object
})(jQuery);

즉시 실행 함수 안에서 $는 전역변수가 아닌 jQuery object의 지역 변수가 되어, Prototype 라이브러리의 $와 충돌 없이 사용할 수 있습니다.






ref : https://opentutorials.org/module/532/6495

ref : http://beomy.tistory.com/9



반응형
반응형

[javascript : 배열, 객체와 반복문처리]

객체일때 key & value 형태와  배열일때 반복문(for in )에서의 인덱스들이 처리 되는 형태가 다른 프로그램과는 좀 다른 차이가 있습니다

그리고 javascript 에서 특이한 점은 객체를 만들 수있는데 c++ 로 치자면 map 과 유사한 형태로 객체가 만들어진다는 것이고

인스턴스를 하나 만든 이후에 임의의 키를 인스턴시.키명 의 형태로 바로 지정하여 value 를 일괄적인 타입 제한 없이 자유형태로 대입할 

수 있다는 것이 다른 프로그램과는 좀 더 확연하게 차이나는 부분입니다



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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
var arr = ['sdfa2323''asdfsadf''c'function () { console.log("tttt"); }];
 
var tt = [{ "s"3 }, { "k"23 }, { "a"30 }];
 
var ob = { "s"3"k"23"a"30 };
 
ob.add = function () {                  // 나중에 객체에 키가 되는 변수와 값을 추가 할 수 있다
 
    console.log('fffffnnnn');
 
    console.log(this.s);                //이때 멤버 변수를 가르킬려면 this. 가 필요함, 없으면 에러
};
 
 
 
console.log('\n==== ob.add() ===\n');
 
ob.add();
 
ob['z'= 10;
 
var ddddd = ob["s"];                    // 이런 형태로 값을 갖어 올 수 있음
 
console.log('\n==== for (var name in ob) ===\n');
 
for (var name in ob) {                          //객체의 경우 for in 으로 호출하게 되면 name 에는 key 값이 들어오지만
 
    console.log(name + "   " + ob[name]);
 
}
 
 
console.log('\n=== for (var name in tt) ====\n');
//!! 배열을 for in 구문으로 불러오면 name 에는 배열읠 인덱스가 문자열 형태로 들어오게 된다
 
for (var name in tt) {                          
 
    console.log(name + "   " + arr[name]);
}
 
 
 
console.log('\n===  forEach(function (item, index)  ====\n');
 
tt.forEach(function (item, index) {             //배열을 foreach 로 호출 할 경우 item 값과 index 값을 받아오는 형태로 작성한다
 
    console.log(item,"     " ,index);
 
});
 
 
console.log('\n=======\n');
 
for (var name in arr) {
    console.log(name + "   " + arr[name]);
}
 
console.log('\n===  console.dir(arr) ====\n');
console.dir(arr);





반응형
반응형

배열과 객체 구분


배열은 var arr = [1,2,3,4];   의 형태로 쓰며 구분자를  [  ] 로 사용하게된다



그렇지만 객체의 경우 { } 중괄호로 구분을 짖고 객체 요소에 대한 명을 지정 할 수 있다


1
var s= { 'first' : 3 }


이렇게 객체를 만들 수 있고 사용은


s.first   와 같이 사용 할 수 있고 이 것이 나타내는 값은 


1
2
3
 



이다




객체를 리턴하는 예









객체의 경우에는 pair 의 표현인  key, value 의 원리와 유사하다



객체의 생성

다음은 객체를 만드는 법이다.

1
var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};

위의 예제에서 egoing은 key가 되고, 10은 value가 된다. 아래는 객체를 만드는 다른 방법이다.

1
2
3
4
var grades = {};
grades['egoing'] = 10;
grades['k8805'] = 6;
grades['sorialgi'] = 80;

아래와 같은 방법으로 객체를 만들수도 있다.

1
2
3
4
var grades = new Object();
grades['egoing'] = 10;
grades['k8805'] = 6;
grades['sorialgi'] = 80;

객체를 만들었으니 이제는 객체에서 필요한 값을 가져와보자. 다음은 sorialgi라는 이름(key)으로 저장된 값을 가져오는 법이다. 결과는 80이다.

1
2
var grades = {'egoing': 10, 'k8805': 6, 'sorialgi': 80};
alert(grades['sorialgi']);

다음 방법으로도 객체의 속성에 접근 할 수 있다.

1
alert(grades.sorialgi);

다음은 객체에 저장된 데이터를 기준으로 반복작업을 하는 방법이다.


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


반응형
반응형
자바스크립트 배열 원소 삭제 방법 - delete, shift, pop, splice

delete

 

배열 항목에서 요소를 undefined 로 만든다.(delete 한다고 하여 요소가 삭제되는 것이 아님 아님!! 주의 : 크기는 그대로 3개)

var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
 
console.log(arr);
delete arr[1];
console.log(arr);

결과




 



shift  

배열에서 첫번째 요소를 제거하고 반환한다. -> 배열 항목에서 요소가 삭제됨

unshift : 첫번째 요소로 추가

 

var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
 
arr.shift();
 

console.log(arr); 


결과


 



pop

배열에서 마지막 요소를 제거하고 반환한다. -> 배열 항목에서 요소가 삭제됨 

push는 추가

 

var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
 
arr.pop();
 
console.log(arr);

 



splice  (실제 요소 갯수가 줄어듬)

splice(start, dleeteCount, elem1...);

 

start에서 시작해 deleteCount 만큼 제거한 후 지정된 요소를 삽입하나, elem... 인자를 입력하지 않으면 삭제만 된다.

var arr = [];
arr.push(1);
arr.push(2);
arr.push(3);
arr.push(4);
arr.push(5);
 
arr.splice(22);
 
console.log(arr);

 

결과





그런데 splice( index ,0   ,    )  0 이 오면 


 splice(1,0, 7,7,7);  을 쓰면 1번지에서 부터 숫자 7,7,7 을 추가하겠다는 뜻이 됨

1
2
3
4
5
6
7
var ku = [0,1,2,3,4];
 
ku.splice(1,0,7,7,7);
 

//결과
ku
 
(8) [0, 7, 7, 7, 1, 2, 3, 4]


 


그렇다면 splice( index , 지울 개수, 추가 원소) ?  의 경우에는?

1
2
3
4
5
6
7
8
9
var ku = [0,1,2,3,4];
 
ku.splice(1,1,7,5);
 
//결과
ku
 
(6) [075234]
 
 
cs


1 번지 부터 1개 지운 다음 7,5 를 추가 한다




slice



 ku.slice( 시작 인덱스,  포함되지 않는 끝 인덱스 )  에 해당 하는 배열을 생성해 리턴한다




Slice 구문

stringObj.slice(start, [end]) 

stringObj

필수 요소. String 개체 또는 문자열 리터럴입니다.

start

필수 요소. stringObj에 지정된 부분의 시작을 나타내는 인덱스입니다.

end

선택 사항입니다. stringObj에 지정된 부분의 끝을 나타내는 인덱스입니다.부분 문자열은 end로 표시된 문자 앞까지만 포함합니다.이 값을 지정하지 않으면 stringObj의 끝까지 부분 문자열이 계속됩니다.

slice 메서드는 stringObj의 지정된 부분을 포함하는 String 개체를 반환합니다.

slice 메서드는 end로 표시된 문자 앞까지만 복사하고 해당 문자는 포함하지 않습니다.

start가 음수이면 length + start로 처리됩니다. 여기서 length는 배열의 길이입니다. end가 음수이면 length + end로 처리되고, end를 생략하면 stringObj의 끝까지 계속 복사됩니다. end가 start 앞에 나오면 새로운 문자열에 아무 문자도 복사되지 않습니다.

첫 번째 예제에서 slice 메서드는 전체 문자열을 반환합니다.두 번째 예제에서 slice 메서드는 마지막 문자를 제외하고 전체 문자열을 반환합니다.



var str1 = "all good boys do fine";

var slice1 = str1.slice(0);
var slice2 = str1.slice(0,-1);
var slice3 = str1.slice(4);
var slice4 = str1.slice(4, 8);

document.write(slice1 + "<br/>");
document.write(slice2 + "<br/>");
document.write(slice3 + "<br/>");
document.write(slice4);

// Output:
// all good boys do fine
// all good boys do fin
// good boys do fine
// good



ref : https://msdn.microsoft.com/ko-kr/library/6w1bzf9f(v=vs.94).aspx


ref : https://jissp.com/board/view/1/8/65 및 일부 편집

반응형

+ Recent posts