1.변수는 블록레벨 범위가 없다.
1)블록레벨이 없음.
function test1(){
var i = 0;
if(i==0){
var j = 1;
}
alert(j);
}
-일반적으로 다른언어에선 if안에 사용된 j는 블록밖에서 사용할수 없으나 js에서는 사용가능.
2)실수하기 쉬운 예
var scope ="global";
function test2(){
alert(scope);
var scope = "local";
}
test();-->'undefined'
-test2에서 에러가 나는 이유는 흔히 생각하기에 전역변수로 사용된 scope가 찍힐것으로 예상하지만 함수안에 scope라는것이 아래에 정의 되어 alert에 scope는 아래의 scope를 가르킨다.하지만 scope라는것이 초기화가 되기 전이므로 undefined가 찍힘.
2.기본형과 참조형
기본형은 값을 할당 받고,참조형은 값을 참조한다.
이와 같이 기본형과 참조형을 타입을 나누고 있지는 않음.하지만 두개는 사용이 아주 틀림.
이렇게 두개를 나누고 있는 이유는 메모리 사용때문.
참조형에는 함수,배열,객체 등이 있고 기본형은 숫자,null,boolean..등
문자는 참조형처럼 참조하고 잇지만 사용은 기본형처럼 하고 있음.
그냥 기본형으로 생각하는것이 속편함.
var a = 1;
var b = a;
a = 4;
alert(b);--->'1' 기본형
var a = [0,1,2];
var b = a;
var a[0] = 3;
alert(b[0]);--->'3' 참조형
3.프로퍼티 정의방법.
프로퍼티 정의방법 아래와 같이 프로퍼티를 정의하는 방법은 모두같은 방법이다.
var object = new Object();
1.object.t = '2';
2.object['t'] = '2';
3.object={t:'2'};
덧)위에는 상수가 들어갔지만 객체가 들어가도 상관없음.
즉,모든 것이 들어가는것이 가능함.
하지만 1,2번은 원래 object에 t를 추가한것이지만 3번은 t가 있는 object를 엎어친것.
4.Prototype 과 상속
원형객체(prototype)은 간단히 말해서 복사본을 만드는것이다.
예를들어 설명을하면..
function rectangle_area(){
return this.x *this.y;
}
function Rectangle(x,y){
this.x = x;
this.y = y;
this.rectangle_area = rectangle_area;
}
이런식으로 정의하면 Rectangle에 rectangle_area라는 프로퍼티에 rectangle_area가
들어간다.
하지만 이경우는 그냥 rectangle_area를 넣는것이다.
한마디로 말해 상단의 rectangle_area와 상관없이 그냥 자신의 rectangle_area가
되는것이다.그렇게 되면 메모리를 많이 차지하게 된다.
하지만 아래와 같은 방법은
function rectangle_area(){
return this.x *this.y;
}
function Rectangle(x,y){
this.x = x;
this.y = y;
}
Rectangle.prototype.rectangle_area =rectangle_area;
이와 같은 방법은 Rectangle에 rectangle_area라는 프로퍼티안에 원형객체가 들어간다.
즉,자신만의 것이 아니라 공유를 하게 된다.
그렇게 때문에 적은 메모리를 사용할수 있다.
자바스크립트에도 상속이라는 개념이 있다.
function rectangle_area(){
return this.x *this.y;
}
function rectangle_area2(){
return this.x+this.y;
}
function Rectangle(x,y){
this.x = x;
this.y = y;
this.rectangle_area= rectangle_area;
}
Rectangle.prototype.rectangle_area= rectangle_area2;
var rec= new Rectangle(2,3);
alert(rec.rectangle_area());
만약에 이렇게 한다면 alert창에 5가 찍힐까? 6이 찍힐까?
일단은 6이 찍힌다.
이유는 프로퍼티를 찾는 순서에 있다.
먼저 rec.rectangle_area()를 하게 되면 본인의 프로퍼티를 rectangle_area가있는지를
확인한다. 있으면 본인의 프로터티를 실행하고. 없으면 다음에 원형객체를 찾게 된다.
그래서 있으면 원형객체의 프로퍼티가 실행된다.
즉,일단 본인의 프로퍼티를 찾은뒤 그다음에 원형객체를 찾는 순서로 간다.
이런식으로 일반적인 메소드는 원형객체로 구현하고 특별한 메소드는 자체에
정의해주는것이 올바른 방법이다.
5.인스턴스변수(메소드)와 클래스변수(메소드)
1)인스턴스 변수와 메소드.
:말그대로 인스턴스와 됬을때 사용하는 변수,메소드를 말한다.
2)클래스 변수와 메소드
:인스턴스와 상관없이 호출되는 변수나 메소드.
예..
function rectangle_area(){
return this.x *this.y;
}
function Rectangle(x,y){
this.x = x;
this.y = y;
this.rectangle_area= rectangle_area;
}
위와 같은 경우 변수,x,y 메소드rectangle_area는 인스턴스 변수나 메소드라고 한다.
즉 var rec = new Rectangle(2,3); 이런식으로 인스턴스화 한후 사용가능하다.
function compare(rec_1,rec_2){
var first_rec = rec_1.rectangle_area();
var second_rec = rec_2.rectangle_area();
if(first_rec>second_rec){
return true;
}
return false;
}
Rectangle.z = 10;
Rectangle.compare= compare;
위와 같이 z,compare는 클래수 변수,메소드라고 한다.
즉,인스턴스를 생성을 안해도 바로 사용이 가능하다는 말이다.
6.함수
7.super class 와 sub class
8.Garbage collection
9.Exception
10.Scope