2016-09-01 3 views
2

주요 관심사는 효율성입니다.이 익명 함수 내에서 사용하는 효율적인 해결 방법은 무엇입니까?

저는 자바 스크립트 범위에서 작업 중이며 혼동스러워하는 한 가지는 기능 내에 this입니다.

많은 답변을 읽었으며 이해했습니다. 하지만 제가 우려하는 것은 효율성입니다. 내 코드 좀 봐.

class Fancy { 
    constructor() { 
    } 

    checkScope (callback) { 
    console.log('Inside checkScope'); 
    callback(); 
    } 
} 

class Prog { 
    constructor() { 
    this.name = 'myProg'; 
    this.fancy = new Fancy(); 
    } 

    run() { 
    var that = this; 
    this.fancy.checkScope(function() { 
     console.log('Name ', that.name); 
    }); 
    } 
} 

var prog = new Prog(); 
prog.run(); 

지금 run()에서 I는 지역 변수 thatthis에서의 레퍼런스를 기억하고있다. 이것은 나를 위해 일하고있다. 하지만 안전합니까? 그것은 효율적입니까? 그렇다면 좋은 전략/트릭을 제안 해주십시오.

감사합니다 :)

답변

2

예는 안전하지만 새 arrow syntax .IT가 this을 보존 할 수 있습니다.

class Fancy { 
 
    constructor() { 
 
    } 
 

 
    checkScope (callback) { 
 
    console.log('Inside checkScope'); 
 
    callback(); 
 
    } 
 
} 
 

 
class Prog { 
 
    constructor() { 
 
    this.name = 'myProg'; 
 
    this.fancy = new Fancy(); 
 
    } 
 

 
    run() { 
 
    // Here your don't need var that = this, 
 
    // because the arrow function gets the same this 
 
    this.fancy.checkScope(() => { 
 
     console.log('Name ', this.name); 
 
    }); 
 
    } 
 
} 
 

 
var prog = new Prog(); 
 
prog.run();

모든 간단한 기능은 당신이 함수 밖에서 this을 유지하고 별명에 사용할 필요가 낭포 당신의

function() { 
     console.log('Name ', this.name); // this is undefined in 'strict mode' 
    } 

this 그것의 자신의 귀하의 경우, this없는거야 기능에서. ES6에는 새로운 arrow syntax function가있다. Arrow functionsthis을 덮어 쓰지 않습니다. 귀하의 경우에는

run() { 

     this.fancy.checkScope(() => { 
      console.log('Name ', this.name); 
     }); 
     } 

run function에서와 parameter functionthis은 동일합니다. arrow function scope에서 thisarrow function이 정의 된 this을 의미합니다.

효율적인 경우에는 추가 변수가 필요하지 않습니다. 추가 변수를 사용하여 로컬 범위를 오염시키지 마십시오. 성능에는 영향이 없습니다.

+0

도움이 될 방법을 설명해주세요. 차이점은 무엇입니까? –

+0

@ ZulfiqarJunejo 업데이트 된 버전보기 –

+0

@SurenSrapyan : 괜찮습니다.하지만 OP는 "효율적입니까?" 부품. 따라서 문제는 "this"를 다른 변수로 캐스팅하여 일반 함수 범위를 사용하는 것보다 더 효율적인지 덜 효율적인 지 여부입니다. - 편집 후 +1; D – briosheje