재미없다~
1k
2017-10-27 11:06:18
7
545

javascript 함수를 람다로 변경하는중 궁금증이 생겼습니다.


기존에 

var a = {

   text : 'a',

  msg: function(){

   alert(this.text);

}

}

이런 형태의 소스가 있었는데 이때는 a.msg() 하면 a가 출력이 됐는데

아래와 같이 람다로 변경 후 this가 window객체로 바뀌어서 a가 출력이 안되더군요

var a = {

   text : 'a',

  msg: () => alert(this.text)

}


기존 function을 람다로 변경했다고 this가 바뀔수가 있는건가요?

0
1
  • 답변 7

  • 초코쪼꼬
    6k
    2017-10-27 11:14:44

    위의 this는 window를 가르키고 있어서 그래요.


    this의 고질병 같은겁니다.

    0
  • 재미없다~
    1k
    2017-10-27 11:31:30

    음 람다를 위해 this.text를 a.text로 바꿔야하는게 맞는건지

    기존코드를 유지하는게 맞는건지 헷갈리네요

    0
  • 초코쪼꼬
    6k
    2017-10-27 11:34:42

    클로저로 쓰면 되지 않을까요?

    0
  • siva6
    4k
    2017-10-27 12:05:16

    기존 코드 유지하세요.
    새로 만드는 코드는 원하는 형태로 쓰시구요.

    0
  • 뒷집할머니
    1k
    2017-10-27 14:23:44 작성 2017-10-27 16:29:08 수정됨

    javascript에서 this는 function이 선언될 때마다 재정의 됩니다.

    일반적인 언어와는 scope이 다르죠.

    그래서 self = this; 처럼 미리할당한 변수를 이용해서 하던지 bind, call, apply 함수를 이용했었죠.


    ES6에서 등장한 arrow function은 this가 새로 정의되지 않습니다.

    그래서 명확하게 function()을 정의한 소스와 this가 달라지는 겁니다.


    이 차이점을 유의하면서 바꾸시면 될 듯 합니다.


    0
  • 재미없다~
    1k
    2017-10-27 14:45:17

    //수송대원 '-'ㆀ

    클로저로 바꾼다면 어떤식으로 접근해야 하나요? 

    이론만 대충 들어보고 실제로 사용해본적은 없어서;;


    //siva6 

    우선 저부분은 유지를 해야겠네요 ㅠ


    //뒷집할머니

    오우 그런 이유가 있었군요. 큰 가르침을 주셔서 감사합니다


    0
  • 초코쪼꼬
    6k
    2017-10-27 14:51:59

    var textFunc = function(text){
     this.text = text;
     return {
      msg : () => alert(this.text),
      getText : () => this.text,
      setText : (text) => this.text = text
     }
    }


    var aTest = new textFunc("aaa");

    aTest.msg() // "aaa" alert

    aTest.setText("bbb") // bbb

    aTest.msg() // "bbb" alert


    var bTest = new textFunc("ccc");

    bTest.msg() // "ccc" alert

    bTest.setText("ddd") // "ddd"

    aTest.msg() // "bbb" alert

    bTest.msg() // "ddd" alert


    뭐 이런 개념으로 쓰면 어떨까 합니다.

    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.