함수 범위(Function Scope)
function helpMe(){
les msg = “I’m on Fire!”;
msg;
}
msg;
let bird = ‘참새’;
function birdWatch(){
let bird = ‘비둘기’;
bird;
}
birdWatch();
bird;
함수 안에서 선언하는 변수는 오직 함수 안에서만 존재한다.
함수 내외 같은 이름으로 정의된 변수가 있을 경우,
함수 내에서는 무조건 함수 내의 변수를 참조한다.
블록 범위(Block Scope)
조건문 뒤에부터 나오는, 중괄호의 {내용물들}을 의미한다.
함수 자리에 함수 대신 블록이 들어간다.
변수가 블록 안에서 선언된다면 해당 변수들은 그 블록의 중괄호 또는 중괄호 두개 사이의 범위에서만 존재한다.
블록 범위도 함수 범위랑 같은 개념인데, 함수가 아닌 조건문과 루프 같은 것이 나온 것 뿐이다.
* var 키워드는 let, const와 다르게 블록 범위에 접근할 수 있다.
let radius = 8;
if(radius > 0){
const PI = 3.14159;
let circ = 2 * PI * radius;
}
console.log(radius);
console.log(PI);
console.log(circ);
렉시컬 범위(Lexical Scope)
부모 함수의 안에 중첩된 내부함수는, 해당 외부 함수의 범위에 또는 범위 내에서 정의된 변수에 접근할 수 있다.
function outer(){
const heroes = [‘IRONMAN’, ‘SPIDERMAN’, ‘BLACK PANTHER’];
function inner(){
for(let hero of heroes){
console.log(`PLEASE HELP ME, ${hero}`);
}
}
inner();
}
중첩된 함수나 내부함수는 부모함수나 조부모함수 등이 접근하는 모든 항목에 동일하게 접근할 수 있다.
함수 표현식(Function Expression)
함수를 정의하는 새로운 방식 : “변수 안에 함수”를 저장하는 것(함수의 이름은 따로 짓지 않는다)
기본적으로 Javascript에서는 함수를 값으로 취급한다.(배열, 객체와 같은..)
사용하면 좋은 점
함수를 인수로 전달할 수 있다.
숫자를 반환하듯이 함수를 변환 값으로 반환할 수 있다.
const square = function(num){
return num*num;
}
square(7);
고차 함수(One of the Higher Older Functions)
다른 함수와 함께 작동하거나 또는 다른 함수에서 작동하는 함수를 고급스럽게 표현한 것.
다른 함수를 인수로 받아서 그 인수로 어떤 작업을 하는 함수
함수를 반환할 수 있는 함수
function callTwice(func){
func();
func();
}
function greet(){
console.log(“HelloWorld!”);
}
callTwice(greet);
함수를 인수로 받을 때, 인수함수의 인수가 없는 이유는, 값이 아닌 함수를 원하기 때문
function winOrLoseFunc(){
const rand = Math.random();
if(rand > 0.5){
return function(){
console.log(‘Congrats! You Win!’)
}
}
else {
return function(){
alert(’Sorry…You Lose…’);
}
}
function makeBetweenFunc(min, max){
return function(num){
return num >= min && num <= max;
}
}
const isChild = makeBetweenFunc(0,18);
isChild(30);
isChild(7);
const isAdult = makeBetweenFunc(19,64);
isAdult(18);
isAdult(20);
풀이) 최소최대값을 인자로 받는 makeBetween함수가 생성되면,
num을 인자로 받는 함수를 반환하고 num을 인자로 받는 함수는 최소최대값을 num과 비교해 값을 반환한다.
METHODS
메서드와 함수
메서드는 객체에 종속된 특성으로 함수에 포함되는 개념이다.
메서드 이름 앞에 . 을 찍어 사용한다.
모든 메서드는 함수이지만, “모든 함수가 메서드인 것은 아니다.”
그래서 메서드를 객체에 추가할 수 있다.
const math = {
multiply : function(x, y){
return x*y;
},
devide : function(x, y){
return x/y;
},
square : function(x){
return x*x
}
}
math.square(30);
const math = {
multiply(x, y){
return x*y;
},
devide(x, y){
return x/y;
},
square(x){
return x*x
},
score : 90
}
math.square(30);
math.scroe;
THIS 키워드
메서드에 있는 객체를 가리킬 때(접근할 때) this 키워드를 사용한다.
객체에 여러가지 특성이 있거나 정보와 메서드가 다양하고 여러 기능이 있을 때 사용한다.
const person = {
first : ‘WookJin’
last : ‘Noh’
fullName( ){
console.log(`${this.first} ${this.last}` 입니다.);
}
}
person.fullName();
person.last = ‘Kim’
person.fullName();
this 키워드는 항상 사용자가 입력한 객체만을 가리키지 않는다.
this값은 바뀔 수 있다. 사용자 함수의 호출 방법에 따라 달라진다.
const person2 = person.fullName;
person2();
person2에 person 함수를 저장했는데도 불구하고 this 키워드가 접근이 안된 이유
그 이유는 같은 함수이지만 다른 방식으로 호출했기 때문이다.
this는 person이라는 객체를 가리키지 않는다.
console.log(this) 를 통해 this의 실체를 보면 파악할 수 있다.
앞서 person()에 console.log(this)를 쓰면 this가 가리키는 건 person()이라는 객체라는 것을 알 수 있다.
하지만 person2()를 실행하면 this가 윈도우 객체를 가리키는 모습을 볼 수 있다.
person.fullName()은 점 왼쪽에 person을 가리키지만
person2()는 왼쪽에 아무것도 가리키지 않는다. 사실 person2()는 왼쪽에 윈도우 객체가 있다. 이 윈도우 객체를 this가 가리킨다고 생각하면 된다.
즉, this가 윈도우 객체를 가리키고 이는 this 키워드에 대한 기본값이 된다. this가 텅 빈 값(객체)을 가리키고 있는 것이다.
때문에 person2를 호출했을 때 앞선 person의 this가 가리켰던 값이 나오지 않는 것이다…
* 윈도우 객체란? 자바스크립트의 최상위 객체. 윈도우는 주요 객체라고 볼 수 있는데 윈도우 안에 모든 것이 있기 때문이다.
콘솔에 window를 입력시 alert 함수를 포함해서 모든 함수를 볼 수 있다. 이는 전부 윈도우 객체 안에 있는 것이다.
const hen = {
name : 'Helen',
eggCount : 0,
layAnEgg(){
this.eggCount = this.eggCount+1;
return 'EGG';
}
}
hen.eggCount;
hen.layAnEgg();
hen.layAnEgg();
hen.eggCount;
Try&Catch 사용하기
두 문은 항상 같이 사용되며, Js의 오류 및 예외를 처리한다.
특히 오류를 잡아내서 코드 실행이 정지되거나 중단되지 않도록 하는 역할을 한다.
catch는 try문 안에서 예외나 오류가 났을 때 실행하는 코드 블록
try {
오류가 실행될 것으로 예상되는 코드
} catch {
console.log(‘ERROR’);
}