묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
클로저 질문입니다
자바스크립트 클로저 함수 공부를 더 해보다가, 클로저개념이 외부함수내에서 내부함수를 쓸때 외부함수가 생을 마감했더라도 외부함수가 지닌 변수를 내부함수에서 사용할수 있다는 개념임을 인지했습니다. 그래서 다음 문제를, 저는 이렇게 풀었는데 오답으로 나와서 곰곰히 생각해보게되었습니다. 이렇게 되었을때, 문제가 지향하는 바가 return 하는 당시 gfunc라는 함수를 재호출 시켜서 함수를 출력시키라는 것일까요? console.log(gfunc())라는 함수를 최종적으로 4번 출력시키는 것이 내부함수의 역할이라면, gfunc = solution()이니까 함수가 영원히 끝나지 않게 되는 것이 아닌가요? 왜냐하면 solution내에 gfunc가있고 gfunc는 solution을 또 호출하니까요.. 긴글 읽어주셔서 감사합니다 클로져(Closure)를 연습해보자 다음과 같은 모습으로 당신이 만든 solution 함수를 실행하고자 합니다 1 2 3 4 5 6 7 8 9 10 // 코드실행 버튼을 누르면 solution 함수를 아래와 같이 실행하게됩니다 // solution 함수의 리턴값의 타입은 함수가 되어야합니다 let gfunc = solution(3,6); // solution 함수로부터 리턴받은 함수를 실행시 다음과 같은 값이 찍히도록 만들어주세요 console.log(gfunc()) // 3 console.log(gfunc()) // 4 console.log(gfunc()) // 5 console.log(gfunc()) // 6 console.log(gfunc()) // undefined function solution(start, end) { return (function () { for (let i = start; i < end + 1; ++i) { console.log(i); } })(); } let gfunc = solution(3, 6);
-
미해결우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
클로저 부분 질문입니다.
안녕하세요? 현재 파이썬 Level2 강의 중 파이썬 일급함수챕터 중 클로저 부분을 수강중입니다. 좀 찾아보면서 헷갈리는 개념이 있어서 질문드립니다. 1. 선생님 강의 + 좀 더 찾아보니 파이썬에는 global / nonlocal / local 영역이 있더군요. 전역변수의 값은 일반적으로 메모리에 보존되는 반면 나머지 nonlocal이나 local 변수들은 함수가 종료되면 변수가 삭제되는게 일반적인 법칙입니다. 하지만 클로저는 그러한 일반적 법칙의 한계를 넘어서 함수가 종료되어도 nonlocal / local 값들을 계속해서 기억하고 있다 고 스스로 정리했는데, 혹시 이게 정확하게 맞는지 알고싶습니다. 2. 선생님의 클로저와 강의 중 클래스를 사용하여 클로저와 비슷하게 구현하신 내용이 있습니다 요부분 인데요, 이 클래스를 활용해서 인스턴스를 생성하고 계속해서 호출을 했을 때 값이 소멸하지 않고 유지되더군요. 그 이유가 궁금합니다. self._series도 전역/지역변수를 공부하고나서 보니까 지역변수에 해당하는 것 같은데 지워지지 않는게 이상하게 느껴져서요. 아니면 혹시 클래스에 의해 만들어진 객체의 모든 값들(self._series 같은 것들도)은 객체가 유지되는 한 함께 보존되는 것인가요? 그래서 마치 클로저 같은 역할을 하는 것인지 궁금합니다.(쓰다보니 그런것같기도하네요 ㅋㅋㅋ..) 3. 마지막으로 nonlocal에 관해서입니다. 1) 2) 1)에는 자유변수로 리스트를 선언했고, 2)에서는 자유변수로 그냥 변수(total같은 것들)를 선언했는데요 2)의 경우에 nonlocal을 붙여주더라구요 이거랑 비슷한 질문을 하신분들이 계셔서 그 답변들을 좀 찾아보면서 좀 정리를 했는데요, 제가 이해한 부분이 맞는지 확인을 받을 수 있을까요? 생소한 개념들이 막튀어 나오다보니까 혼자 정리를 하고서도 맞는지를 모르겠습니다 ㅠㅠ A : - 파이썬은 일반적으로 local영역을 넘어서는 다른 영역의 변수에 대해서는 읽거나 참조를 할 뿐, 수정이나 새로이 할당을 하는 것이 제한한다. 더 자세히 말하면, 제한하기 위하여 별다른 선언(nonlocal, global)등이 없으면 무조건 local영역내의 변수에 관한것이라고 전제한다. - 리스트나 dict의 경우 mutable하며 요소를 추가해주거나(특히 append를 활용하여) 할때 메모리 주소가 바뀌지 않음. 즉 읽거나 참조하는 것이므로 이러한 과정은 허용 -하지만 일반적인 변수는 immutbale하므로 값을 변환해주었을 경우 ID값이 교체되며 완전히 새로운 값이 되며 이는 허용된 권한을 넘는 것 -이에따라 파이썬은 새로이 수정되는 변수가 무조건 local영역내의 변수라고 전제함. -파이썬의 이러한 전제를 제거(?)하기위해 nonlocal을 선언해줘서, nonlocal영역에 위치한 변수를 내부 변수(여기선 averager)에서 사용할 수 있게 함 다적고 보니.. 질문이 너무 많네요 좋은 강의에 감사드립니다.
-
해결됨모던 자바스크립트 딥다이브 스터디
코어 자바스크립트 예제 5-14 질문
안녕하세요. 모던 자바스크립트를 읽다가 책이 빠르게 굵직한 부분을 훑고 싶어 강사님의 저서 '코어 자바스크립트'를 읽던 중 질문이 생겨 질문드립니다. 먼저 강의에 관련된 질문이 아닌 점 죄송합니다. 클로저, 135쪽, 예제 5-14, 부분 적용 함수 구현(1) const partial = function () { // 01 const originalPartialArgs = arguments; // 02 const func = originalPartialArgs[0]; if (typeof func !== "function") { throw new Error("It's not a function."); } return function () { // 07 console.log(arguments); const partialArgs = Array.prototype.slice.call(originalPartialArgs, 1); const restArgs = Array.prototype.slice.call(arguments); // 09 return func.apply(this, partialArgs.concat(restArgs)); }; }; 1. 9번째 줄의 arguments는 7번째 줄에서 return되는 익명함수의 렉시컬 환경에서 새로 생성된 argument이기 때문에 partial함수의 렉시컬 환경의 arguments(2번째 줄)과 다르다. 2. 7번째 줄에서 익명함수 선언 시 9번째 줄의 arguments는 익명함수의 렉시컬 환경에 수집되어 빈 객체 상태로 익명함수가 return된다.(실행 컨텍스트가 활성화 된느 시점이 아닌 선언 시점에 정보가 수집된다.) 3. 후에 21번째 줄에서 익명함수를 할당받은 addPartial 함수가 22번째 줄에서 호출 될때 7번째 줄의 arguments가 arguments object [6,7,8,9,10]로 재할당 된다. 4. 8번째 줄의 originalPartialArgs가 클로저를 이용한 것이다. 처음에 7번째 줄의 익명함수 속 arguments가 상위 스코프의 arguments(2번째 줄)을 참조한다고 생각했고 결과가 달라 고민한 결과 위와 같이 결론을 내렸습니다. 제가 잘 이해한 것인지 확인받고싶어 질문 드렸습니다. 다시한번 강의와 무관한 질문 드려 죄송합니다.
-
미해결자바스크립트로 알아보는 함수형 프로그래밍 (ES5)
순수함수에 대해서 질문있습니다.
안녕하세요 유인동님! 순수함수 관련 질문이 있습니다. <질문1> ```js const addMaker = (a) => { // (*) return (b) => { // ....add return a + b; } } ``` 위 코드의 (*) 부분에서 인자 a를 변경하고 있지 않기 때문에 add이 순수함수라고 하셨는데, (*)에서 a를 변경하지만 이후 add 함수가 호출되는 상황에서는 변경되지 않는다는 것이 보장되어도 순수하지 않을걸까요?? 가령 다음과 같은 경우에 순수함수를 리턴한다고 보기 어려운 것인지 궁금합니다. ```js const addMakerInMod3 = (a) => { a %= 3; return (b) => { // ....add return a + b; } } ``` <질문2> 모듈 코드 상에 변수를 선언하고 함수 안에서 이를 참조해도 이 변수를 변경하지 않는다는게 보장되면 순수함수라고 부를 수 있을까요? ```js // module.js const a = 10; const add10 = (b) => a +b; ```
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
4:56 새로운 객체를 반환
판교님, 질문있습니다. data는 function()에 다시 새 객체를 반환하는데, methods는 바로 객체를 열어서 addTodo: ... 로 작성하는 이유를 알 수 있을까요?
-
미해결[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
person.getAge() 값이 왜 수정이 안되는지 모르겠습니다;;
클로저 공부를 하다가 인터넷에서 이런 예시가 있어서 RunJS에서 따라쳐봤는데요. person.age를 30으로 바꿨고, person.age를 출력했을 때는 30이 찍히는데, 왜 person.getAge( ); 로 찍었을 때는 15로 계속 나오는지 도저히 이해가 안되네요ㅠ 왜 이런 현상이 발생하는 건가요??? ;;;;;;;
-
미해결코딩인터뷰를 저격하는 JS 스나이퍼 양성학교
클로저 파트 마지막 예시에 관해 질문있습니다.
예시를 RunJS에서 따라쳐봤는데요. person.age를 30으로 바꿨고, person.age를 출력했을 때는 30이 찍히는데, 왜 person.getAge( ); 로 찍었을 때는 15로 계속 나오는지 도저히 이해가 안되네요ㅠ 왜 이런 현상이 발생하는 건가요??? 제가 이해력이 부족해서, 강의만으로 온전히 이해가 안되네요. 이 부분에 대해서 좀 더 자세한 설명 부탁드리겠습니다. 감사합니다.- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
블록, 함수 스코프, 클로저 문제 강의에서 질문입니다
for(var i=0; i<winBalls.length; i++){ (function(j) { setTimeout(() => { console.log(winBalls[j], j); drawBall(winBalls[j], $result); }, 1000 * ( i + 1)); })(i); } 강의 중에 즉시 실행함수로 해당 문법응ㄹ 보았는데요. function(j)라는 함수는 매개변수 i를 입력받기 때문에 1000 * (i + 1)은 1000 * (j + 1)이라고 써주는 것이 좀 더 일관성이 있는것은 아닌지 질문드립니다. 물론 i로 써도 실행에는 전혀 문제가 없지만, 이왕 function에서 매개변수를 j로 받은이상 j로 쓰는게 좋겠지요?
-
미해결앨런 iOS Concurrency(동시성) - 디스패치큐와 오퍼레이션큐의 이해
lazy var 관련 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. GCD 자료 277p에서 lazy var와 관련된 질문 사항인데요. testVar라는 변수가 클로저에 ()가 붙여져 있는데, 제가 알기론 이렇게 되어있다면, testVar을 읽을 때마다 클로저가 호출되서 async로 보내든 말든 매번 랜덤한 수가 나와야되는데 실제론 그렇지 않더라구요. GCD와 관련된 질문은 아니지만, 이걸 정확히 이해하면 뒷내용을 확실히 파악할 수 있을 것 같아서요. 혹시 이유를 알 수 있을까요? 사실상 저 변수는 클로저인데 사용할 때마다 매번 호출되어 {}에 있는 코드들이 매번 실행되어야하는 거 아닌가요? 감사합니다.
-
해결됨웹 게임을 만들며 배우는 자바스크립트
안녕하세요 클로저 부분에서 질문 있습니다.
코드 function one() { for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, i * i * 100); } } function two() { for (var i = 0; i < 3; i++) { closure(i); } } function closure(i) { setTimeout(() => { console.log(i); }, i * i * 100); }; one(); two(); 생각한 실행 결과 3 3 3 0 1 2 실제 결과 3 0 3 1 3 2 이렇게 나오는데 혹시 생각한 실행 결과처럼 나오게 하려면 어떻게 할 수 있나요?