gmlwjd9405 / gmlwjd9405.github.io Goto Github PK
View Code? Open in Web Editor NEW:seedling: Heee's Development Blog
License: MIT License
:seedling: Heee's Development Blog
License: MIT License
- HTTP
- Request 형식
- Request Method
- Response 형식
- 응답 코드
이름 | 프로토콜 | 포트 | 기능 |
---|---|---|---|
www | HTTP | 80 | 웹 서비스 |
SMTP/POP3/IMAP | 25/110/114 | 이메일 서비스 | |
FTP | FTP | 21 | 파일 전송 서비스 |
DNS | TCP/UDP | 53 | 네임 서비스 |
NEWS | NNTP | 119 | 인터넷 뉴스 서비스 |
규칙
Edwith 강의 참고
- 자바스크립트의 선언 방식변수의 종류를 확인한다.
- var과 let, const의 차이에 대해 이해한다.
- 자바스크립트의 연산자의 종류 및 개념을 이해한다.
- 자바스크립트의 타입의 종류를 확인한다.
- 자바스크립트에서 type 체크 방법에 대해 이해한다.
- 자바스크립트에서 null 체크 방법에 대해 이해한다.
// 함수의 호출.
function printName(firstname) {
var myname = "HEEE";
return myname + " " + firstname;
}
function printName(firstname) {
var myname = "HEEE";
var result = myname + " " + firstname;
}
자바스크립트에서는 함수도 객체이다.
TIP 함수 호출 vs 함수 참조
testFunc()
// test!! (함수 호출)testFunc
// function testFunc() // (함수 참조)const f = testFunc
함수를 변수에 할당하면 f()
과 같이 다른이름으로 함수를 호출할 수 있다.함수를 객체 프로퍼티에 할당할 수도 있다.
const o = {}
o.f = testFunc
o.f() // test!!
const arr = [1, 2, 3]
arr[1] = testFunc
arr[1]() // test!!
// 함수의 호출.
function printName(firstname) {
var myname = "HEEE";
return myname + " " + firstname;
}
var test1 = function() { // (익명) 함수표현식
return '익명 함수표현식';
}
var test2 = function test2() { // 기명 함수표현식
return '기명 함수표현식';
}
/* 정상 */
function printName(firstname) { // 함수선언문
var inner = function() { // 함수표현식
return "inner value";
}
var result = inner();
console.log("name is " + result);
}
printName(); // "name is inner value"
/* 오류 */
function printName(firstname) { // 함수선언문
console.log(inner); // "undefined": 선언은 되어 있지만 값이 할당되어있지 않은 경우
var result = inner(); // ERROR!!
console.log("name is " + result);
var inner = function() { // 함수표현식
return "inner value";
}
}
printName(); // TypeError: inner is not a function
/** --- JS Parser 내부의 호이스팅(Hoisting)의 결과 --- */
/* 오류 */
function printName(firstname) { // 함수선언문
var inner; // Hoisting - 변수값을 끌어올린다. (선언은 되어 있지만 값이 할당되어있지 않은 경우)
console.log(inner); // "undefined"
var result = inner(); // ERROR!!
console.log("name is " + result);
inner = function() { // 함수표현식
return "inner value";
}
}
printName(); // TypeError: inner is not a function
Q. "printName이 is not defined" 이라고 오류가 나오지 않고, function이 아니라는 TypeError가 나오는 이유?
A. printName이 실행되는 순간 (Hoisting에 의해) inner는 'undefined'으로 지정되기 때문
inner가 undefined라는 것은 즉, 아직은 함수로 인식이 되지 않고 있다는 것을 의미한다.
함수표현식보다 함수선언문을 더 자주 사용하지만, 어떤 코딩컨벤션에서는 함수표현식을 권장하기도 한다.
/* 정상 */
function printName(firstname) { // 함수선언문
var result = inner();
console.log(typeof inner); // "function"
console.log("name is " + result);
function inner() { // 함수선언문
return "inner value";
}
}
printName(); // "name is inner value"
/** --- JS Parser 내부의 호이스팅(Hoisting)의 결과 --- */
/* 정상 */
function printName(firstname) { // 함수선언문
function inner() { // Hoisting - 함수선언을 끌어올린다.
return "inner value";
}
var result = inner();
console.log(typeof inner); // "function"
console.log("name is " + result);
}
printName(); // "name is inner value"
함수가 실행되면 그 안에는 arguments라는 특별한 지역변수가 자동으로 생성됩니다.
arguments의 타입은 객체 입니다.(console.log( typeof arguments) 로 확인해보세요!)
자바스크립트 함수는 선언한 파라미터보다 더 많은 인자를 보낼 수도 있습니다.
이때 넘어온 인자를 arguments로 배열의 형태로 하나씩 접근할 수가 있습니다.
arguments는 배열타입은 아닙니다.
따라서 배열의 메서드를 사용할 수가 없습니다.
function a() {
console.log(arguments);
}
a(1,2,3);
자바스크립트의 가변인자를 받아서 처리하는 함수를 만들때 등에서 arguments속성을 유용하게 사용할 수가 있습니다.
응용해보기
arguments속성을 사용해서 , 1~무한대까지 인자를 받아 합을 구하는 함수를 만들어봅시다.
생각해보기
arrow function
ES2015에는 arrow function이 추가됐다.
arrow function 참고 바로가기
간단하게 함수를 선언할 수 있는 문법으로 처음에는 꽤 낯설수 있습니다.
하지만 점점 많이 사용되고 있는 syntax이므로 같이 알아두어도 좋을 것 같습니다.
function getName(name) {
return "Kim " + name ;
}
//위 함수는 아래 arrow함수와 같다.
var getName = (name) => "Kim " + name;
변수/함수 '선언'과 밀접한 관련이 있다.
JS 엔진을 코드를 실행하기 전에 코드 전반에 걸쳐서 선언된 내용이 있는지 쭉 훑어보고 발견하는 족족 위로 끌어올린다.
var로 선언한 변수 / 함수는 선언만 끌어올려진다는 것이며, 할당은 끌어올려지지 않는다.
var를 쓰면 혼란스럽고 쓸모없는 코드가 생길 수 있다. 그럼 왜 var와 호이스팅을 이해해야 할까?
function
이라는 키워드를 사용하지 않고 =>
로 대체// ES5 함수 정의 방식 (function expression)
var sum = function (a, b) {
return a + b;
};
// ES6 함수 정의 방식
var sum = (a, b) => {
return a + b;
}
sum (10, 20);
/* 화살표 함수 사용 예시 */
var arr = ["a", "b", "c"];
// ES5
arr.forEach(function(value){ // 익명 함수
console.log(value); // a, b, c
});
// ES6
arr.forEach(value => console.log(value)); // a, b, c
function
예약어를 생략하고 생성 가능// 객체
var dictionary = {
words: 100,
/* 속성 메서드: 속성에 function을 연결 */
// ES5
lookup: function() {
console.log("find words");
},
// ES6 - ': funtion' 생략
lookup() {
console.log("find words");
}
};
var figures = 10;
var dictionary = {
// figures: figures,
figures
};
var a = 2;
var a = "aaa";
var a = 'aaa';
var a = true;
var a = [];
var a = {};
var a = undefined;
{}
에 상관없이 스코프가 설정된다.var sum = 0;
for(var i = 1; i <= 5; i++) {
sum = sum + i;
}
console.log(sum); // 15
console.log(i); // 6
{}
로 변수의 범위가 제한되었다.
let sum = 0;
for (let i=1; i<=5; i++) {
sum = sum + i;
}
console.log(sum); // 10
console.log(i); // Uncaught ReferenceError: i is not defined
const
: 한번 선언한 값에 대해서 변경할 수 없다.(상수 개념)
/* 예시 */
const a = 10;
a = 20; // Uncaught TypeError: Assignment to constant variable
/* [주의!] 하지만, 객체나 배열의 내부는 변경할 수 있다. */
const a = {};
a.num = 10;
console.log(a); // {num: 10}
const b = [];
b.push(20);
console.log(b); // [20]
let
: 한번 선언한 값에 대해서 다시 선언할 수 없다. 변경은 가능
function f() {
{
let x;
{
// 새로운 블록 안에 새로운 x의 스코프가 생김
const x = "sneaky";
x = "foo"; // 위에 이미 const로 x를 선언했으므로 다시 값을 대입하면 Error
}
// 이전 블록 범위로 돌아왔기 때문에 'let x'에 해당하는 메모리에 값을 대입
x = "bar";
let x = "inner"; // SyntaxError: Identifier 'x' has already been declared
}
}
// or 연산자 활용
const name = "myname";
const result = name || "default";
console.log(result); // myname
const result2 = name && "test";
console.log(result2); // test (&&의 경우, 뒤의 값이 할당된다.)
var name = "";
var result = name || "default";
console.log(result); // default
const data = 11;
const result = (data > 10) ? "ok" : "fail";
console.log(result); // ok
비교는 == 보다는 === 를 사용한다.
==로 인한 다양한 오류 상황 예시
0 == false; // true
"" == false; // true
null == false; // false (null은 객체)
undefined == false; // false
0 == "0"; // true
null == undefined; // true
TIP 자바스크립트의 null 체크에서의 ! 사용 시 주의
var target;
target = 0;
console.log(!target); // true
target = null;
console.log(!target); // true
target = undefined;
console.log(!target); // true
target = "";
console.log(!target); // true
target = {};
console.log(!target); // false
target = [];
console.log(!target); // false
toString.call()
함수를 이용해서 그 결과를 매칭하곤 하는데, 문자, 숫자와 같은 자바스크립트 기본 타입은 typeof
키워드를 사용해서 체크할 수 있습니다.toString.call("test"); // "[object String]"
const target = "test";
typeof target; // "string"
변수 선언 방식
반복문과 조건문
데이터 타입별 기본적인 메소드들
형변환 및 연산자, 표현식 등
const f1 = function() { return 'hello' }
// 또는
const f1 = () => 'hello'
const f2 = function(name) { return 'hello, ${name}' }
// 또는
const f2 = name => 'hello, ${name}'
const f3 = function(a, b) { return a + b }
// 또는
const f3 = (a, b) => a + b
함수가 정의될 때
변수와 상수, 매개변수가 언제 어디서 정의되는지 결정하는 것을 말한다.
스코프 vs 존재
정적 스코프
전역 스코프
블록 스코프
var a = 1;
function outer() {
console.log(a); // 1. 1
function inner() {
console.log(a); // 2. undefined
var a = 3;
}
inner();
console.log(a); // 3. 1
}
outer();
console.log(a); // 4. 1
함수처럼 생겼는데 .이 붙은 것
함수와 메소드의 차이점
객체의 프로퍼티인 함수를 메서드라고 불러 일반적인 함수와 구별한다.
예시
const o = {
name: 'Wallace', // 원시 값 프로퍼티
bark: function() {
return 'Woof!' // [방법1] 함수 프로퍼티(메서드)
}
bark2() {
return 'Woof?' // [방법2] ES6 문법 - 함수 프로퍼티(메서드)
}
}
something will call this function back(sometime somehow)
제어권을 넘겨준다. 맡긴다.
콜백함수를 어떻게 처리할지는 넘겨받은 대상이 결정한다.
예시 1
// MDN 정의
setInterval(callback, milliseconds)
setInterval(function () {
console.log('1초마다 실행될 겁니다.');
}, 1000);
주기함수 setInterval 호출. 인자1: 콜백함수, 인자2: 주기(ms)
1초마다 1번씩 자동으로 콜백함수를 부른다.
즉, 콜백함수에 대한 제어권을 setInterval에게 넘긴 것이다.
예시 2
// MDN 정의
arr.forEach(callback[, thisArg])
/*
currentValue: 배열에서 현재 처리 중인 요소.
index: 배열에서 현재 처리 중인 요소의 인덱스.
array: forEach()가 적용되고 있는 배열.
*/
// 같은 동작을 하도록 직접 구현
Array.prototype.forEach = function(callback, thisArg) {
var self = thisArg || this; // thisArg가 없으면 Array의 인스턴스
for(var i = 0; i < this.length; i++) {
callback.call(self, this[i], i, this); // this 바인딩의 핵심. value, index, array
} // callback에 어떤 데이터를 매개변수로 넘겨줄지 정해져 있다.
}
var arr = [1, 2, 3, 4, 5];
var entried = [];
arr.forEach(function(v, i) {
entries.push([i, v, this[i]]);
}, [10, 20, 30, 40, 50]);
console.log(entries);
반복함수 forEach 호출. 인자1: 콜백함수, 인자2: this로 인식할 대상(생략가능)
콜백함수에 대한 제어권을 forEach에 넘겼다.
결과: [ [0, 1, 10], [1, 2, 20], [2, 3, 30], [3, 4, 40], [4, 5, 50], ]
예시 3
var arr = [1, 2, 3, 4, 5];
// 첫 번째 인자는 index를, 두 번째 인자는 value를 받고 싶다고 하자.
arr.forEach(function(index, value) {
console.log(index, value);
});
하지만! 정의되어 있는 forEach에 의해 실제 출력 결과는 value, index 순으로 들어간다.
즉, 콜백함수를 정의할 때 파라미터의 순서는 제어권을 넘겨받을 대상(여기서는 forEach)의 규칙을 반드시 따라야 한다.
예시 4 - 이벤트 핸들러
document.body.innerHTML = '<div id="a">abc</div>';
function cbFunc(x) {
console.log(this, x);
}
document.getElementById('a').addEventListener('click', cbFunc);
$('#a').on('click', cbFunc); // JQuery
<div id="a">abc</div> => MouseEvent {isTrusted: true, screenX: 11, ...
// MDN 정의
target.addEventListener(type, listener[, useCapture]);
/*
type: 등록할 event type을 나타내는 문자열
listener: 특정 타입의 이벤트가 발생할 때 알림을 받을 객체.
*/
var arr = [1, 2, 3, 4, 5];
var obj = {
vals: [1, 2, 3],
logValues: function(v, i) {
if(this.vals) {
console.log(this.vals, v, i);
} else {
console.log(this, v, i);
}
}
};
obj.logValues(1, 2); // 1.
arr.forEach(obj.logValues); // 2.
{_vals: Array{3}, logValues: f} 1 2
Window {stop: f, open: f, alert: f, confirm: f, prompt: f, ...} 1 0
const o = {
name: 'doy',
speak() {
return 'My name is ${this.name}',
}
}
const speak = o.speak
speak === o.speak // true, 두 변수는 같은 함수를 가리킨다.
speak() // 'My name is undefined!'
함수를 이렇게 호출하면 자바스크립트는 이 함수가 어디에 속하는지 알 수 없으므로 this는 undefined에 묶인다.
중첩된 함수 안에서 this를 사용하려다보면 혼란스러울 때가 많다.
const o = {
name: 'doy',
greetBackwards: function() {
// 추가
const self = this
function getReverseName() {
let nameBackwards = ''
for(let i=this.name.length-1; i>=0; i--) {
// nameBackwards += this.name[i]
// 아래로 변경
nameBackwards += self.name[i]
}
return nameBackwards
}
return `${getReverseName()} si eman ym ,olleH`
},
}
o.greetBackwards()
const o = {
name: 'doy',
greetBackwards: function() {
const getReverseName = () => {
let nameBackwards = ''
for(let i=this.name.length-1; i>=0; i--) {
nameBackwards += this.name[i]
}
return nameBackwards
}
return `${getReverseName()} si eman ym ,olleH`
},
}
o.greetBackwards()
console.log(this);
는 windowconsole.log(this);
는 global// Ex 1) a객체
var a = {
b: function() {
console.log(this);
}
}
a.b();
// Ex 2) a.b객체
var a = {
b: {
c: function() {
console.log(this);
}
}
}
a.b.c();
var a = 10;
var obj = {
a: 20,
b: function() { // b는 메서드, c는 함수
console.log(this.a); // 20
function c() {
console.log(this.a); // 10
}
c();
}
}
obj.b();
var a = 10;
var obj = {
a: 20,
b: function() { // b는 메서드, c는 함수
var self = this;
console.log(this.a); // 20
function c() {
console.log(self.a); // 20
}
c();
}
}
obj.b();
var callback = function() {
console.dir(this);
};
var obj = {
a: 1,
b: function(cb) {
cb(); // 결과: window
cb.call(this); // 결과: Object i a: 1 b: function(cb)...
// 제어권을 넘겨받은 함수나 메서드가 this를 다른 것으로 명시하면, 다른 객체 출력
}
};
obj.b(callback);
var callback = function() {
console.dir(this);
};
var obj = {
a: 1
};
setTimeout(callback, 100); // 결과: window
setTimeout(callback.bind(obj), 100); // 결과: Object
function Person(n, a) {
this.name = n;
this.age = a;
}
var gomugom = new Person('고무곰', 30);
console.log(gomugom)
func.call(thisArg[, arg1[, arg2[, ...]]]) // 즉시 호출
func.apply(thisArg, [argsArray]) // 즉시 호출 (배열 요소를 함수 매개변수로 사용해야 할 때 유용)
func.bind(thisArg[, arg1[, arg2[, ...]]]) // 새로운 함수 생성(currying), 호출 X
function a(x, y, z) {
console.log(this, x, y, z);
}
var b = {
c: 'eee'
};
a.call(b, 1, 2, 3);
a.apply(b, [1, 2, 3]);
var c = a.bind(b);
c(1, 2, 3);
var d = a.bind(b, 1, 2);
d(3);
Object {c: "eee"} 1 2 3
으로 동일A closer is the combination of a function
and the lexical environment(사전적 환경) which that function was declared.
=> 함수와 함수가 선언된 어휘적 환경의 조합이다.??
선언 당시의 환경에 대한 정보를 담은 객체 (구성 환경)
function a() {
var x = 1;
function b() {
console.log(x);
}
b();
}
a();
console.log(x);
지역변수 보호
데이터 보존 및 활용
function a() {
var x = 1;
return function b() {
console.log(x);
}
}
var c = a();
c(); // x의 값을 출력. 하지만 변경은 불가.
function a() {
var _x = 1;
return function b() {
get x() { return _x; },
set x(v) { _x = v; }
}
}
var c = a();
c.x = 10; // 외부에서 x 프로퍼티 변경 가능.
function setName(name) {
return function() {
return name;
}
}
var sayMyName = setName('고무곰');
sayMyName();
var car = {
fuel: 10, // 연료(l)
power: 2, // 연비(km/l)
total: 0,
run: function(km) {
var wasteFuel = wasteFuel;
this.total += km;
}
};
var createCar = function(f, p) {
var fuel = f;
var power = p;
var total = 0;
return {
run: function(km) {
var wasteFuel = km / power;
if(fuel < wasteFuel) {
console.log('이동 불가');
return;
}
fuel -= wasteFuel;
total += km;
}
}
};
var car = createCar(10, 2);
return한 객체에 포함되지 않은 멤버들은 private하다.
return한 객체에 포함된 멤버들은 public하다.
함수 내부에서 다시 함수를 return하면
return된 함수를 그 함수가 최초로 선언될 당시 정보를 유지한다.
그래서 외부에 노출할 데이터만 return하면 return하지 않은 데이터는 모두 외부에서 접근을 제한할 수 있다.
이에 따라 지역변수를 안전하게 보호할 수 있으며
그러면서도 외부에 지역변수의 변경 권한을 넘겨줌으로써 데이터를 활용할 수 있다.
객체지향 프로그래밍, 함수형 프로그래밍의 쿼리에 클로저를 많이 사용하기 때문에 반드시 알아야할 지식이다.
Constructor -> new -> instance
prototype - -> proto
즉, 생성자 함수의 프로토타입과 instance의 __proto__라는 프로퍼티는 같은 객체를 참조한다.
__proto__는 내부 프로퍼티에 접근할 때 생략할 수 있다.
하지만 proto 프로퍼티는 살아있는 것이다.
예시
Array -> new -> [1, 2, 3]
Array.prototype(배열 메서드 모두 포함) - -> [1, 2, 3]
[CONSTRUCTOR]
[CONSTRUCTOR].prototype.constructor
(Object.getPrototypeOf([instance])).constructor
[instance].proto.constructor
[instance].constructor
function Person(n, a) {
this.name = n;
this.age = a;
}
var gomu = new Person('고무곰', 30);
var iu = new Persion('아이유', 25);
gomu.setOlder = function() {
this.age += 1;
}
gomu.getAge = function() {
return this.age;
}
iu.setOlder = function() {
this.age += 1;
}
iu.getOlder = function() {
return this.age;
}
function Person(n, a) {
this.name = n;
this.age = a;
}
Person.prototype.setOlder = function() {
this.age += 1;
}
Person.prototype.getAge = function() {
return this.age;
}
var gomu = new Person('고무곰', 30);
var iu = new Persion('아이유', 25);
gomu.__proto__.setOlder();
gomu.__proto__.getAge(); // NaN
gomu.setOlder(); // __proto__가 생략이 가능하므로, this는 gomu를 가리킨다.
gomu.getAge(); // 31
Person.prototype.age = 100;
gomu.__proto__.setOlder();
gomu.__proto__.getAge(); // 101
gomu.setOlder();
gomu.getAge(); // 31
Array -> new -> [1, 2, 3]
Array.prototype(배열 메서드 모두 포함) - -> [1, 2, 3]
즉, Array 프로토타입은 객체이다.
또한 __proto__는 생략이 가능하기 때문에 마치 자신이 호출하는 것처럼 사용 가능
프로토타입은 모두 객체이므로 모든 데이터 타입은 한결같이 이와 동일한 구조를 따른다.
예시
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.