객체지향 함수.. this... 진짜 혼미함 ㅋㅋㅎㅎㅠㅜㅠ
감이 오면서도 안오는 이것들.. 그냥 this가 사용되는 여러가지 환경을 다 외워버리고,
그때마다 개념을 떠올리는 형식으로 해야겠다.
이해가 도저히 안되는것들은 일단 넘기자, 라고 생각한게 이주째... 이러다가 그냥 다 넘겨버리는거 아닌지 걱정된다.
도움 됐던 글 두개 첨부!! 두고두고 봐야지..
https://velog.io/@padoling/JavaScript-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98%EC%99%80-this-%EB%B0%94%EC%9D%B8%EB%94%A9)
<< 진짜 명료하게 잘 써놓으셔서, 절대 안지우셨으면 좋겠다..>>
https://cocoder16.tistory.com/45
코드가 없어도 실행환경(실행 컨텍스트가) 초기화됨
레퍼런스변수 (this)는 글로벌 스코프에서 Window를 가리킴.
- this : window (글로벌 객체)
- 변수들 (variable obeject) : {} (빈 객체)
- scope chain : [] (최상위 스코프)
<script>
function myFunc(){
let a = 10
let b = 20
function add (first, second){
return first + second
}
return add(a,b)
}
</script>
myFunc()
---------------------------------------
- this :undefined
- 변수들 (variable obeject) : {
first :10
second : 20
}
- scope chain : [myFunc, global]
---------------------------------------
- this : undefined (strict mode)
- 변수들 (variable obeject) : {
a: 10
b: 20
add function{...}
}
- scope chain : global
---------------------------------------
- this : window (글로벌 객체)
- 변수들 (variable obeject) : {myFunc}
- scope chain : [] (최상위 스코프)
<script>
let o = {
name : 'Daniel'
method : function(number){
return this.name.repeat(number)
}
}
function myFunc(){
let n = 10
return o.method(n)
}
myFunc()
</script>
---------------------------------------
// o.method 실행 컨텍스트
- this :o
- 변수들 (variable obeject) : {
number :10
}
- scope chain : [myFunc, global]
---------------------------------------
// myFunc의 실행 컨텍스트
- this : undefined
- 변수들 (variable obeject) : {
n: 10
}
- scope chain : global
---------------------------------------
- this : window (글로벌 객체)
- 변수들 (variable obeject) : {
o: {...},
myFunc: function(){...}
}
- scope chain : [] (최상위 스코프)
<script>
const myName = "Elice";
function Coder() {
const title = "Coder Land";
return title;
}
</script>
전역 렉시컬 환경 : Myname(식별자) + "Elice" (식별자에 연결된 값) , Coder
Coder 함수의 렉시컬 환경 : title(식별자 + "Coder land"(식별자에 연결된 값)
또한 전역 렉시컬 환경에 스코프체인으로 연결되어있음. 전역에는 Coder라는 정보를 갖고 있기 때문.
<script>
const o = {
method(){
console.log("context: ", this) // o
let f1 = function(){
console.log("[f1] this : " , this)
}
let f2 = () =>
console.log("[f2] this : " , this)
f1() // global
f2() // o
}
};
o.method()
</script>
<script>
function findMin(...rest){ // 인자들을 배열로 묶어줌 [7,3,4,2,4,1]
return rest.reduce((a,b) => a < b ? a :b )
}
findMin(7,3,5,2,4,1) //1
</script>
<script>
const o = {
name : "Daniel",
age : 23,
address : "Street",
job : "Software Engineer",
};
const { age, name, ...rest } = 0; // 이때 rest는 어드레스와 잡 을 포함한 객체임.
findSamePerson(age,name);
</script>
<script>
const o = {
name : "Daniel",
age : 23,
address : "Street",
job : "Software Engineer",
};
let o2 = {...o, name : "Tom", age : 24}
let o3 = {name : "Tom", age : 24 ...o}
o2.job //Software Engineer
o3.name // Daniel
</script>
<script>
function findMinInObject(o){
return Math.min(...Object.values(o))
}
let o1= { a: 1}
let o2= { b: 3}
leto3= { c: 7}
findMinInObject(
mergeObjects(o1, o2, o3)) // 1
</script>