22,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결코어 자바스크립트
함수형태로 호출된 this가 undefined
부록으로 올려주신 강의중 예제코드에 대한 설명을 듣고 node로 실행해보았는데, 아래의 코드에서 c()호출로 인한 console.log의 값이 undefined가 나오는데, 해당 블럭에서 this가 전역객체를 가르키게 되니까 10이 나와야 한다고 설명해주셨는데, 왜 undefined가 나오는 것이까요 !?... var a = 10; var obj = { a: 20, b: function () { console.log(this.a); function c() { console.log(this.a); } c(); }, }; obj.b();
- 미해결코어 자바스크립트
this가 가르키는 값이...
아래의 코드를 node로 실행해보면 콜백함수가 실행이 될때 vals of undefined... 에러가 발생합니다! this 가 전역객체를 가르키게 된다고 배운것 같은데 전역에 var varls를 정의해도 읽지못하네요 ... 혹시 이유를 여쭤봐도 되까요 ㅠㅠ var arr = [1, 2, 3, 4, 5]; // var vals = [1,1,1]; 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); arr.forEach(obj.logValues); 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); arr.forEach(obj.logValues);
- 미해결코어 자바스크립트
class 상속 구현 강의 질문 있습니다.
강의의 6:11 때의 그림을 보다가 문득 궁금한 점이 생겼습니다.현재 강의에서는 Bridge 라는 객체를 사용하는데,그냥 Employee.prototype = Person.prototype 를 해주면 되는 거 아닌가요?? 아니면 혹시 어떤 차이점이 있기 때문에 Bridge를 쓰신건가요?
- 미해결코어 자바스크립트
prototype chaining 강의 마지막에 나오는 코드를 따라해봤는데요...
제목 그대로 prototype chaining 강의 마지막에 나오는 코드를 따라했는데요, 일반적인 html에 script 태그 안에 넣어서 돌리면 잘됩니다. 콘솔창에 잘 뜹니다.그런데 문제는 현재 이 강의를 재생하는 상태에서 제가 옆에 콘솔창을 띄우고 똑같이 해봤는데요 이런 에러가 납니다. 맨 처음 출력은 되는게 보이지만 그 이후로 무수한 에러가 납니다... 이유가 뭘까요? 궁금합니다!
- 해결됨코어 자바스크립트
__proto__ 로 하지 않는 이유가 따로 있을까요??
안녕하세요!! 너무 좋은 강의 잘 보고 있습니다. bridge를 통해서 static method, variable과 연결고리를 끊는 부분에 대해서 질문 드립니다. <1> function Person() { this.staticBye = function() { console.log("bye"); } } Person.prototype.prototypeHi = function() { console.log("hi"); } function Employee() { } function Bridge() {} Bridge.prototype = Person.prototype; Employee.prototype = new Bridge(); Employee.prototype.constructor = Employee; const e = new Employee(); e.prototypeHi(); // hi e.staticBye(); // TypeError: e.staticBye is not a function <2> function Person() { this.staticBye = function() { console.log("bye"); } } Person.prototype.prototypeHi = function() { console.log("hi"); } function Employee() { } Employee.prototype.__proto__ = Person.prototype; const e = new Employee(); e.prototypeHi(); // hi e.staticBye(); // TypeError: e.staticBye is not a function <1>: bridge를 사용한 경우 <2>: __proto__ 로 연결한 경우 이 경우 __proto__ 를 사용하였을 때와 같은 결과를 보여주는 것 같은데, bridge를 사용하는 이유가 어떤 이유일지 궁금해서 질문을 드리게 되었습니다. 추가로 new 키워드로 prototype과 연결했을 때 (Employee.prototype = new Bridge();) Employee의 prototype과 constructor에 어떤 일이 일어나는지 알아보고 싶은데, 어떻게 검색해야 할지 감이 잘 오지 않아서 혹시 이 부분에 대해서 관련한 키워드 조금만 던져주시면 정말 감사하겠습니다!! 좋은 강의 정말 잘 듣고 있습니다!!
- 미해결코어 자바스크립트
생성자 함수에서 스태틱 메소드에 접근이 불가능하다는 부분이 이해가 되지 않습니다.
안녕하세요! 스태틱 메소드에 접근이 불가능하다는 부분이 이해가 안돼서 질문드립니다! 4분 50초 쯤에있는 코드에서, 아래와 같은 코드를 작성하면 인스턴스에서도, 스태틱 프로퍼티와 스태틱 메서드에 직접 접근이 가능할 것 같은데 안된다고 하셔서 다른 의미로 말씀하신건지 궁금합니다. function Person(name, age){ this._name = name; this._age = age; this.getInformations = function(instance) { return { name: instance._name, age: instance._age, }; } } 그리고, 추가적으로 궁금한 것이 있는데 constructor가 인스턴스를 생성할 때 어떤식으로 진행하는 것인지 궁금합니다. var 인스턴스 = new 생성자함수(); 라고 있을 경우에 생성자함수에 있는 모든 값을 그대로 복제해서 인스턴스를 생성하는 줄 알았는데 그게 아닌 것 같아서 궁금합니다. 제가 추측하기로는 new 연산자를 통해 플레인 생성자 함수의 prototype이 포함된 껍데기를 만들어 인스턴스를 생성하고, 생성된 인스턴스로 this 바인딩을 한 뒤에 함수가 실행되면서, 자연스럽게 this. 으로 되어있는 변수나 메서들만 새로운 인스턴스에 추가가 되는 것 같은데 이 순서가 맞는건지 궁금합니다! 감사합니다.
- 미해결코어 자바스크립트
bind함수대신 var self = this로 바꾸어서 만들어보려하는데요.
var callback = function() { console.dir(this); }; var obj = { a: 1 }; setTimeout(callback.bind(obj), 100); 위 예시를 bind를 쓰지 않고 만들어 보려고 하는데요. 제가 만든 방법은 아래와 같은데, 혹시 더 간단하게 만드는 다른 방법이 있을까요? var obj = { a: 20, b: function() { var self = this; var c = function() { console.log(self); } setTimeout(c, 100); } } obj.b();
- 미해결코어 자바스크립트
안녕하세요. 잘못 된 부분을 수정해주셨는데 이해가 되지 않습니다.
안녕하세요! 수정된 부분에 대해서 궁금해서 질문드립니다. callback.call(slef, this[i], i, this); 를 callback.call(this, this[i], i, self); 로 수정해주셨는데 어떻게 그렇게 되는건지 이해가 되지않습니다. forEach가 callback함수로 아래 3개를 받는 걸로 알고있는데, 그렇다면 원래 순서가 맞지 않는지 궁금합니다. 그리고 this 바인딩도 self로 되어야 하는게 맞지 않나요? 감사합니다. currentValue[[, index,] forEach()를 호출한 배열]
- 해결됨코어 자바스크립트
온라인강의 건너뛰고 오프라인 부록강의만 봐도 상관없나요?
.
- 미해결코어 자바스크립트
return으로 인한 할당에 관련하여 질문드립니다.
6:36 익명 함수를 정의 하고 반환한다는 것 까지는 이해가 가는데 반환된 익명함수가 변수 count에 할당된 다는 것이 이해가 잘 가지 않습니다. return function 이라는 것을 setCounter 함수로 받아들여야 하나요?? return이 나오니 갑자기 헷갈리는 것 같습니다 ㅠ
- 해결됨코어 자바스크립트
코어 자바스크립트 질문입니다!
번거롭게 해드려 죄송합니다 아마 코어 자바스크립트 서적 내에서는 마지막 질문이 될 것 같습니다 194페이지의 에제 7-12와 관련한 질문입니다 157페이지에 따르면, 생성자 함수의 프로퍼티인 프로토타입 객체 내부에는 constructor라는 프로퍼티가 있는데, 이는 생성자 함수 자기 자신을 참조합니다. 그렇다면, 191페이지의 Bridge를 통한 상속 흉내에서, Bridge의 프로토타입이 참조하는 Rectangle의 프로토타입에는 constructor프로퍼티가 있고, 이 프로퍼티는 Rectangle을 참조하는 것이죠? 그런데 193페이지의 밑부분의 설명을 보면 SubClass의 프로토타입이 SuperClass대신 Bridge의 인스턴스를 바라보고 있으므로 SuperClass와의 관계를 복구해야 한다고 설명해주셨습니다. 그렇다면, Bridge.prototype = SuperClass.prototype 이 코드를 실행하는 과정에서 SuperCalss.prototype.constructor속성이 변경되나요? 제가 생각하기에는 예제 7-12의 7번째 줄인 Bridge.prototype.constructor = SuperClass; 이 작업이 필요가 없을 것 같은데 무엇을 놓친 것인지 궁금합니다.
- 해결됨코어 자바스크립트
코어 자바스크립트 질문입니다!
192페이지의 '예제 7-9에서는 즉시실행함수 내부에서 Bridge를 선언해서 이를 클로저로 활용함으로써 메모리에 불필요한 함수 선언을 줄였습니다.'부분에 관한 질문입니다! 메모리에 불필요한 함수 선언을 줄였다는 부분이 잘 이해가 되지 않습니다 1.즉시실행함수가 실행되면 즉시실행함수의 컨텍스트가 활성화되고, 2.즉시실행함수의 렉시컬 환경의 환경 레코드에 Bridge와 (return으로 반환되는)함수 선언문이 담기며, 3.Bridge에 빈 함수가 할당되고, 4.익명함수를 반환하며 즉시실행함수의 컨텍스트가 종료. 5.반환된 함수에서 Bridge를 참조하고 있기 때문에 가비지 컬렉터가 Bridge를 수거하지 않음. 저는 이렇게 이해했는데요, 선생님의 표현을 빌리자면 이 Bridge가 메모리 '소모'를 하고 있는 것이죠...? 이그렇다면 이 때 메모리에 불필요한 함수 선언을 줄였다는 것이 어떤 상황과 대비했을 때를 말하는 것인지 잘 모르겠습니다 ㅠ 1. 클로저를 활용한 것이 메모리에 불필요한 함수 선언을 줄였다. 2. 함수 표현식으로 선언할 경우, 전역 컨텍스트의 렉시컬 환경의 환경 레코드에서 그 함수를 참조하고 있으므로, extendClass2에 해당 함수의 실행 결과를 할당하더라도, 전역 컨텍스트가 종료되기 이전에는 여전히 해당 함수가 메모리를 차지하고 있다. 작성하다 보니 2번일 것 같기는 한데 확신이 들지 않아 여쭤봅니다 ㅠㅠ
- 미해결코어 자바스크립트
prototype chaining 강의 예제로 만들어진 toString 작동원리(?) 설명 부탁드립니다
안녕하세요! 강의 4:23부터 나오는 toString method를 제대로 이해 못한 것 같아서 질문드립니다.. 제가 이해한 바는 다음과 같습니다:1. obj.toString()을 호출하면(실행시키면?) res 배열이 생성 2. obj의 각 프로퍼티 값에 대해 toString() 실행. 2.1. a: 1의 경우 1이 객체가 아니므로 기존 toString() 메서드가 실행됨. res[0] = a: 1 2.2. b: {c: 'c'}의 경우 2.2.1. 값인 {c: 'c'}가 객체이므로 {c: 'c'}에 예제에서 만든toString() 자신이 다시 호출됨. {c: 'c'} 반환. 2.2.2 res[1] = b: {c: 'c'} 3. {res[0], res[1]} 반환 질문드리고 싶은 내용은 다음과 같습니다: 1. 제가 잘못 이해하고 있는 부분이 있는 것 같아서 어떤 부분을 잘못 이해하고 있는지 알려주시면 감사하겠습니다ㅜ 확인차 var obj = {a: 1, b: 'c', d: {c: 'c'}} ; Object.prototype.prac = function(){ var res = []; for(var key in this){ res.push(`${key}: ${typeof this[key]=== 'object'? this[key].prac(): this[key].toString()} `); }; return '{'+res.join(', ')+'}'; } 로 예제를 바꿔서 실행해봤는데 반환값이 a: 1, b: c, d: {c: 'c' 로 마지막 프로퍼티 값에 뒷쪽 중괄호가 반환이 안되어서요, 원리를 잘못 이해하고 예제를 바꿔서 이런 오류가 나는 게 아닌가 싶은 생각이 들었습니다.. 중괄호가 반환되지 않는 이유도 함께 설명해주시면 감사하겠습니다..! 2. 윗 obj.prac() 반환값에 prac method가 포함되었습니다. 강의 예제와는 달리 method가 함께 반환된 이유를 알고 싶습니다. 강의 잘 들으면서 도움 많이 받고 있습니다! 답변 해주시길 기다리겠습니다..! 감사합니다!
- 미해결코어 자바스크립트
데이터타입 오프라인 온라인 차이
온라인 강의를 다 듣고 오프라인 강의를 들어보니깐 기본형데이터 타입은 주소값이 바뀌고 데이터는 그대로 나둔다고 했는데 온라인 강의 부분에서는 그낭 그 주소값에 데이터를 덮어 씌운다고 하는데 어느게 정확한가요 ?
- 해결됨코어 자바스크립트
코어 자바스크립트 질문입니다!
165페이지 '프로토타입 체이닝'에 관한 질문입니다. var arr = [1, 2]; Array.prototye.toString.call(arr); Array의 프로토타입에는 toString이라는 메서드가 없으니 프로토타입 체이닝으로 거슬러 올라가서 Object의 프로토타입에 있는 toString메서드를 참조한다는 것은 알겠습니다. call로 arr를 this바인딩 해주었으니 출력 결과도 '1, 2'가 나오는 것도 이해가 됩니다. 그런데 Object.prototype.toString.call(arr);의 출력 결과가 [object Array]가 나오는 것은 왜인가요? 똑같이 Object의 프로토타입에 정의된 메서드를 호출한 것이고, this바인딩도 같은 값을 참조하는데 무엇이 다른 것인지 모르겠습니다. (메서드의 호출 주체가 서로 다르다 할지라도, call로 this바인딩을 동일하게 묶어주었으면 다를 것이 없지 않나요?) 또, 저는 교재의 설명상 원래 다른 생성자에는 toString메서드가 없고, 오직 Object.prototype에만 toString메서드가 있는 것으로 이해했습니다. 다른 생성자로 생성된 인스턴스들이 toString메서드를 참조할 수 있는 것은 프로토타입 체이닝을 통해 호출하는 것이고요. 그런데, mdn에서 toString을 검색해보면 다른 생성자 함수의 프로토타입에도 toString이 정의되어 있는 것처럼 보입니다. 개발자 도구에서 로그를 찍어봐도 아래와 같이 나오고요. 책 출판 시점에서 그새 무언가 바뀌었는가 싶다가도, 어쨌거나 Object.prototype.toString.call(arr);의 출력 결과가 [object Array]인 것에 대해서는 이해가 잘 안됩니다. mdn의 설명에 따르면, 커스텀 객체에서 toString메서드를 호출하면 Object로부터 상속받은 기본 값을 반환하게 된다고 설명되어 있는데, 애초에 자바스크립트에는 '상속'의 개념은 없지 않나요? 질문이 중구난방이라 죄송합니다 ㅠ
- 해결됨코어 자바스크립트
코어 자바스크립트 질문입니다!
코어 자바스크립트 138~139페이지 질문입니다(이미지가 두 개 동시에 안 올라가네요 ㅠ) debounce함수는 콜백으로써 호출되는 함수이지만, addEventListener에 의해 debounce함수 내의 this는 document.body가 되는 것으로 알고 있습니다. 그렇다면 mousemove혹은 mousewheel이벤트가 발생했을 때, debounce함수가 내뱉은 익명함수가 실행될 것이고, 여기에서 self에 할당한 this는 document.body가 되는 것이죠...? 그런데 이 self를 왜 func에 bind해주어야 하는지 잘 이해가 되지 않습니다 ㅠ 인자로 받는 func는 moveHandler나 wheelHandler함수인데, 이 두 함수의 경우 console.log만을 수행할 뿐, this에 접근할 일이 없는데 왜 bind 작업이 필요한 건가요...?
- 미해결코어 자바스크립트
null이 Primitive Type이 맞나요?
typeof(null) 했을 때, 'object'로 출력이 되는데, 튜터님의 설명에서는 primitive type으로 되어 있어서 혼란스럽습니다! 어떤게 맞는 건가요 ?_?
- 미해결코어 자바스크립트
1. 데이터 타입에서 기본형과 참조형의 차이에 대해 궁금한 점이 있습니다.
책, 강의 보면서 혼자 이해해보았는데 제대로 이해하고 있는 것인지 궁금합니다. 참조형의 가변성을 설명하신 부분중에(코어 자바스크립트, 20p 불변객체 부분) '참조형 데이터의 가변은 데이터 자체가 아닌 내부 프로퍼티를 변경할 때만 성립합니다'이라고 말씀하셨는데, 여기서 궁금한 부분은 2가지가 있습니다. 1. '참조형 데이터의 가변은 데이터 자체가 ~' 여기서 데이터란 말은 var obj; 에서 프로퍼티들의 집합을 표현(?)하기 위해 할당한 메모리 주소값을 의미하나요 ? 예를 들어 var obj; 은 @1004의 식별자를 obj로 하고 데이터(이름 : obj, 값 @5006)일 때, 여기서 객체에 다른 객체를 할당하는 경우 즉, @5006 -> @5008로 변경되는데 여기서 [ @5006 ,@5008 ]이 말씀하신 데이터 인가요 ? 2 '~ 내부 프로퍼티를 변경할 때만 성립합니다' obj.a 값이 3이고 아래와 같이 표현했을 때, @5003의 데이터 3은 기본형이기 때문에 '불변성'을 지니고, @8204(obj.a)의 값은 데이터로 '기본형'이 아닌 '주소값'을 가지기 때문에 변할 수 있다(그냥, 다른 것을 참조만 하면 되니깐...?). 이런 이유로 참조형은 데이터 자체가 변하는 경우가 아닌, 그 내부의 프로퍼티의 데이터가 변하는 경우에만 '가변'이라는 말이 성립하는건가요 ? 주소 8204 ~ | 5003 데이터 이름: a, 값 : @5003 ~ | 3
- 미해결코어 자바스크립트
감사드립니다!
프로토타입에 대해 항상 명확히 이해 하지 못해 찜찜한 마음이 컷는데 오랜 시간 고민하시고 깨우치신 것을 가르쳐 주셔서 정말 감사드립니다! :)
- 해결됨코어 자바스크립트
화살표 함수의 this
강의에는 없는 내용이지만 this 관련 궁금증이 생겨 질문남깁니다. 다음 강의에 있는 내용이라면 죄송합니다. const a = { aa: function() { console.log(this); }, bb: () => { console.log(this); } 이렇게 했을 때 화살표 함수는 왜 window를 가리키게 되는지 궁금합니다.