목록Programming/Javascript (37)
fffo
전역 변수의 문제점 변수의 생명 주기 변수가 런타임 이전에 선언되는 것은 전역변수 한정 지역 변수는 해당 스코프가 실행 될 때 선언되고 스코프가 끝날 때 소멸 됨 변수가 할당된 메모리 공간은 누군가가 참조하고 있지 않을 때 가비지 콜랙터에 의해 해제 됨 → 누군가 참조하고 있다면 해제되지 않고 남아있음 일반적으로 함수가 종료되면 함수가 생성한 스코프도 소멸하지만 누군가 스코프를 참조하고 있으면 스코프는 해제되지 않고 생존 → 클로저 전역 객체 전역 객체 : 코드가 실행되기 이전 단계에 js엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체 브라우저 : window node.js : global 환경에 따라 전역 객체를 가리키는 다양한 식별자(window, self, this, frames, globa..
스코프 스코프 : 식별자가 유효한 범위 식별자는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정됨 스코프는 js 엔진이 식별자를 검색 할 때 사용하는 규칙이라고도 볼 수 있음 스코프 내에서 식별자는 유일해야하지만 다른 스코프에는 같은 이름의 식별자 사용 가능 → 스코프는 네임스페이스라고 볼 수 있음 전역과 지역으로 나뉨 렉시컬 환경(lexical environment) 코드가 어디서 실행되며 주변에 어떤 코드가 있는 지를 말함 코드의 문맥(constext)은 렉시컬 환경으로 이루어 짐 이를 구현한 것이 실행 컨텍스트(execution context) 모든 코드는 실행 컨텍스트에서 평가되고 실행됨 스코프 체인 함수의 중첩 : 함수 몸체 내부에서 함수 정의 중첩 함수 ..
깊은 복사 JSON 내장객체 이용 : 객체를 문자열로 바꿨다가 다시 객체로 바꿈으로써 깊은 복사 수행 json에는 함수 데이터 타입이 없기 때문에 함수 프로퍼티가 누락됨 외부 라이브러리 lodash의 cloneDeep(ob) 메서드 사용 : 함수 프로퍼티 포함, 객체의 모든 부분을 새로 생성해서 복사 const _ = require("lodash"); const original = { func: function () { console.log("ppap"); }, obj: { a: 1, b: 2, }, }; const deepCopyJSON = JSON.parse(JSON.stringify(original)); console.log(original.obj === deepCopyJSON.obj); // fa..
함수 매개변수(parameter) : 함수 내부로 입력을 전달 받는 변수 인수(argument) : 입력 값 코드의 재사용 → 유지보수의 편의성, 코드의 신뢰성, 코드의 가동성 함수 리터럴 함수는 객체 타입의 값이기 때문에 함수도 함수 리터럴로 생성 가능 일반 객체와 함수 객체의 다른 점 → 함수는 호출 할 수 있음, 함수 객체 고유의 프로퍼티 가짐 함수 이름은 함수 몸체 내에서만 참조할 수 있는 식별자. 생략 가능함 함수 정의 함수 선언문, 함수 표현식, Function생성자 함수, 화살표 함수(ES6)를 통해 정의 각각의 정의 방법은 미묘한 차이가 존재 함수 선언문 함수 선언문은 표현식이 아닌 문 함수 리터럴은 선언문일 수도, 표현식일 수도 있는 중의적 표현 함수 선언문에서는 함수 객체를 가리키는 주..
원시 값과 객체의 비교 원시 값 : 변경 불가능한 값 변수에 할당 시 변수(확보된 메모리 공간)에는 실제 값이 저장됨 원시 값을 가진 변수를 다른 변수에 할당 시 원본의 원시 값이 복사 되어 전달. 값에 의한 전달(pass by value) 객체 : 변경 가능한 값 변수에 할당 시 변수(확보된 메모리 공간)에는 참조 값이 저장됨 객체를 가진 변수를 다른 변수에 할당 시 원본의 참조 값이 복사 되어 전달 됨. 참조에 의한 전달(pass by reference) 원시 값 변경 불가능 하다는 것은 변수가 아닌 값에 대한 진술 데이터의 신뢰성 보장 원시 값이 할당된 변수를 재할당 시 새로운 메모리 공간 확보 후 재할당한 원시 값을 저장, 변수는 새로옵게 재할당한 원시 값을 가리킴 → 불변성 불변성을 갖는 원시 ..
객체 리터럴 객체란 0개 이상의 프로퍼티로 구성된 집합. 프로퍼티는 키와 값으로 구성됨 js는 객체 기반의 프로그래밍 언어, 원시 값을 제외한 나머지 값들은 모두 객체 원시 타입 : 하나의 값을 가짐 변경 불가능한 값(immutable value) 객체 : 다양한 타입의 값을 가짐 변경 가능한 값(mutable value) 모든 값은 프로퍼티 값이 될 수 있음 js의 함수는 값으로 취급할 수 있는 일급 객체임 프로퍼티 값으로 함수가 올 경우 일반 함수와 구분하기 위해 메서드라고 부름 객체 리터럴에 의한 객체 생성 클래스 기반 객체지향 언어(C++, java) : 클래스를 사전에 정의, 필요한 시점에 new 연산자와 함께 생성자(constructor)를 호출하여 인스턴스를 생성하는 방식으로 객체 생성 인스..
타입 변환과 단축 평가 타입 변환 명시적 타입 변환 == 타입 캐스팅 암묵적 타입 변환 == 타입 강제 변환(type coercion) 암묵적 타입 변환 맥락에 맞춰서 js엔진이 암묵적으로 바꿔줌 적절한 암묵적 타입 변환은 가독성에 기여할 수 있음 12 + '' // "12" true + '' // "true" NaN + '' // "NaN" [10,20] + '' // "10,20" +"32" // 32 +null // 0 +true // 1 +false // 0 +undefined // NaN +[] // 0 +[1,2] // NaN Falsy 값들 false undefined null 0, -0 NaN '' (빈 문자열) 명시적 타입 변환 표준 빌트인 생성자 함수를 new 연산자 없이 호출 빌트인 ..
제어문 switch 문 fall through : 평가 결과와 일치하는 case문으로 실행 흐름을 이동하지만 이후의 모든 switch문 안에 있는 코드를 실행하는 것 if ...else 문과 비교해서 가독성이 더 좋은 것을 선택하여 적절히 사용 break 문 중첩된 for문에서 바깥 for문을 탈출 하려면 lable을 사용. 하지만 레이블 문은 프로그램의 흐름을 복잡하게 하고 가독성을 나쁘게 할 수 있으므로 지양 outer: for(let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { if(something[i][j] === 3) break outer; } } continue 문 if문 내에서 실행해야 할 코드가 한 줄 이상일 때 continue를 사용하면 깊..