일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Access Denied
- 메모리 영역
- 우테코
- Til
- 과제
- COMMIT
- 프리코스
- pull request
- 승인 대기
- 기능구현
- fork
- 6일차
- GIT
- 도커
- 리팩토링
- 커밋
- AR필터
- 우아한테크코스
- merge
- 목표 변경
- 7일차
- 정규표현식
- docker-compose.yml
- 3일차
- docker
- 정리
- 1주차 끝
- string 메서드
- 5일차
- 4일차
- Today
- Total
목록JavaScript Deep Dive (21)
수레바퀴아래서
함수는 객체이지만 일반 객체와는 다르다. → 일반 객체는 호출할 수 없지만 함수는 호출 가능. 함수 객체는 일반 객체가 가지고 있는 내부 슬롯과 내부 메서드 추가로 함수 객체만을 위한 [[Environment]],[[FormalParameters]] 등 내부 슬롯과 [[Call]],[[Construct]] 같은 내부 메서드를 추가로 가짐 [[Call]] : 일반적인 함수로서 호출시 [[Construct]] : 생성자 함수로서 호출시 → 이걸 가진 함수 객체 constructor 이걸 갖지 않는 함수 non-constructor constructor : 함수 선언문, 함수 표현식, 클래스 non-constructor : 메서드(ES6 메서드 축약표현), 화살표 함수 // 일반 함수 정의 : 함수 선언문, ..
내부 슬롯(internal slot), 내부 메서드(internal method) → 의사 프로퍼티와 의사 메서드다. ([[…]])로 감싼 이름들 프로퍼티 어트리뷰트 : Js 엔진은 프로퍼티를 생성시 프로퍼티의 상태를 나타내는 어트리뷰트를 기본값으로 자동 정의. 프로퍼티의 상태 → 값, 갱신 가능 여부, 열거 가능 여부, 재정의 가능 여부 데이터 프로퍼티 : [[Value]],[[Writable]],[[Enumerable]],[[Configurable]] : prototype 접근자 프로퍼티 : [[Get]],[[Set]],[[Enumerable]],[[Configurable]] : __proto__
let : 변수 중복 선언 금지, 블록 레벨 스코프, 변수 호이스팅(console.log(foo); let foo; 이런 식으로 있으면 참조에러,ReferenceError 발생), var 로 만든 것은 window의 프로퍼티 이지만 let 으로 만든 것을 그러지 않다 const 변수는 반드시 선언과 동시에 초기화 ex) const foo=1; ex) const TAX_RATE =0.1; -> 스네이크 표기법 const로 선언된 변수에 객체가 할당된 경우 객체는 바꿀 수 없지만 객체의 속성들의 값은 변경 가능하다. ES6를 사용한다면 var는 사용하지 말자 재할당이 필요한 경우에 한해서 let을 사용하자 이때 스코프는 최대한 좁게 변경이 없는 원시 값과 객체에는 const 키워드 사용. 만약 바꿀일 생기면..
var x='global'; function foo(){ console.log(x); // undefined var x='local'; } foo(); console.log(x); // global 함수 foo가 선언되면 함수 내의 변수들이 런타임 전에 올라오므로 x = undefined 가 되고 console.log(x)에서는 undefined 출력 두번째 console.log()에서는 전역변수가 출력 Js의 경우 파일이 분리되어 있어도 하나의 전역 스코프를 공유한다!!!!!!! 모듈 패턴 특징 : 클래스를 모방해서 관련이 있는 변수와 함수를 모아 즉시 실행 함수로 감싸 하나의 모듈을 만드는것.(클로저 기반으로 동작, 전역변수 억제, 캡슐화 구현)
스코프 : 어떤 변수를 참조할지 전역 스코프 : 코드 어디에서든 참조 가능 지역 스코프 : 함수 코드 블록이 만든 스코프로 자신과 하위 함수에서만 참조 함수레벨 스코프 : 코드 블록이 아닌 함수에 의해서만 지역 스코프가 생성(함수내 지역 변수) var i=10; for(var i=0; i 여기서는 좀 그치 블록레벨 스코프 : C와 같다고 보면됨(블록 단위로 실행 → 위에서 var i=0; 이런식으로 있는 부분 즉 for문 내에서 i를 지역 변수로 가짐) 렉시컬 스코프 : 정적스코프 var x=1; function foo(){ var x=10; bar(); } function bar(){ console.log(x); } foo();//1 bar();//1 foo(); bar(); 둘다 1이 실행된다. ba..
함수 생성 시점과 함수 호이스팅 // 함수 참조 console.dir(add); // f add(x,y) console.dir(sub); // undefined // 함수 호출 console.log(add(2,5)); // 7 console.log(sub(2,5)); // TypeError:sub is not a function // 함수 선언문 function add(x,y) { return x+y; } // 함수 표현식 var sub = function (x,y) { return x-y; }; // 변수 선언문과는 다르게 함수 선언문은 위처럼 생김 함수 표현식을 사용할 것을 권장 변수 생성 시기 잘 알아두기
원시 타입의 값 : 변경 불가능한 값(불변성, 변수에 값을 재할당 시 : 새로운 메모리 공간 확보 → 재할당한 값 저장 → 변수가 참조하던 메모리 공간 주소 변경) 객체 타입의 값 : 변경 가능한 값 원시값을 다른 변수에 할당 → 얕은 복사 개념(값에 의한 전달) 객체 값을 다른 변수에 할당 → 깊은 복사 개념(참조에 의한 전달)
옵셔널 체이닝 연산자 → ?. 좌항의 피연산자가 null 또는 undefined인 경우 undefined 반환 아닌 경우 우항의 프로퍼티 참조 var elem=null var value = elem?.value; console.log(value) // undefined 널 병합 연산자 → ?? 좌항의 피연산자가 null 또는 undefined인 경우 우항의 피연산자 반환 아닌경우 좌항의 피연산자 반환 var foo = null ?? 'default string'; console.log(foo) // "default string"