it('lexical scope와 closure에 대해 다시 확인합니다.', function () {
let age = 27;
let name = 'jin'; // --> jimin
let height = 179;
function outerFn() {
let age = 24; // --> 26
name = 'jimin';
let height = 178;
function innerFn() {
age = 26;
let name = 'suga';
return height; //--> 178
}
innerFn(); //호출 위로올라감 178리턴됌
expect(age).to.equal(26);
expect(name).to.equal('jimin'); //suga는 지역변수라서 지역을 벗어나면 사용할수 없음
return innerFn; //또다시 리턴 //이름만 넣은건 호출이아니기때문에 innerFn()함수 전체를 리턴함
}
const innerFn = outerFn(); //innderFn은 선언만 됐지 호출은 안됌!!!! 이름이아니라 역할로 구분
//호출과 선언은 다릅니다
/* const innerFn() {
age = 26;
let name = 'suga';
return height; //--> 178
} */
expect(age).to.equal(27); //age는 위에랑 관련이 없음. 전역변수 27. 위에랑 관련이 없음 24,26은 지역벗어나면 못씀
expect(name).to.equal('jimin');
expect(innerFn()).to.equal(178);
});
lexical scope와 closure에 대해서 잘 모르고 있었다.
함수의 선언과 호출은 다르다.
변수와 함수의 이름이 똑같다고 같은것이 아니다.
arr.slice는 arr의 값을 복사하여 새로운 배열을 리턴한다.
빈 객체의 length는 undefined다 0이아님!!
객체의 length는 그냥 구할 수 없다.
Object.keys(obj).length
이렇게 obj의 키들을 뽑아내서 키들의 갯수로 키들의 길이를 구해야함
arguments
를 통해 '비슷하게' 함수의 인자들을 다룰 수 있다.
arguments
는 모든 함수의 실행시에 자동으로 생성되는 '객체'이다. 배열같이 생긴게 나오지만 배열이아니다. 배열 메소드를 사용할 수 없다.
Array.isArray
에 넣어보면 false
가 나온다