2016-12-31 11 views
0

다음과 같이 JavaScript로 몇개의 샘플 코드를 가지고 있습니다. 버튼을 클릭하면 객체 이름이 인 doSomething이라는 private 메소드가 전역 이름에 동일한 이름의 메소드가 존재하더라도 항상 xyz이라는 이름으로 호출됩니다. JavaScript 수준에서 어떤 일이 벌어지고 있는지 이해하려고합니다.JavaScript에 같은 이름의 전역 메소드가있는 경우 개인 메소드가 항상 호출되는 이유는 무엇입니까?

질문 :이 상황에서, 왜 항상 같은 이름의 글로벌 방법보다는라고하기 해봐요의 개인 방법은 무엇입니까?

<script> 
 
    function doSomething() { 
 
     alert('this is a global method available to all'); 
 
    } 
 

 
    var xyz = function() { 
 
     var x = {}; 
 
     x.FirstName = "Mike"; 
 
     x.changeSeat = function() { 
 
      doSomething(); 
 
     } 
 

 
     function doSomething() { 
 
      alert('this is a private method'); 
 
     } 
 

 
     return x; 
 
    }(); 
 
</script> 
 

 
<button type="button" onclick="xyz.changeSeat();">Private or Global method is called when same name methods exist?</button>

+2

[나란히]의 범위 (http://ryanmorr.com/understanding-scope-and 내 전역을 덮어 doSomething -context-in-javascript /)는이 주제에 대해 이해하는 데 도움이 될 수 있습니다. – 31piy

+0

@ 31piy, 당신이 지적한 기사에서, 그것은 의미가 있습니다. 메소드 doSomething이 객체 xyz 내에서 호출되기 때문에 자바 스크립트는 먼저 객체 xyz의 범위 내에서 해당 메소드를 찾은 다음 해당 메소드가없는 경우 JavaScript 만 사용하여 객체 xyz 바깥의 범위 수준으로 이동합니다. – Sunil

+0

내부의'doSomething()'이 처음으로 정의되면 놀라지 않을 것입니다. 그것은 범위 지정이 아니며, 실제로 당신이 요구하고있는 것은 hoisting *입니다. – Tomalak

답변

0

xyzdoSomething 내부를 정의하면 xyz

+0

용어는 * shadowing *입니다. "덮어 쓰기"는 전역 변수가 변경되었음을 의미합니다. – Bergi

+0

의견을 보내 주셔서 감사합니다. 영어가 제 주요 언어가 아닙니다. 어떤 용어가 더 적절할 것입니까? "범위 내에서 [...] 덮어 쓰기"라는 말은 전 세계적으로 발생하지는 않지만 그 범위 내에서만 가능하다는 것을 의미했습니다. – Rudi

+0

'doSomething'이라는 전역 변수는'xyz'의 범위에서 같은 이름의 로컬 변수에 의해 * shadowed *됩니다. 다른 용어는 "보이지 않음"또는 "어둡게"될 수 있습니다 (영어는 제 1 언어가 아니지만) – Bergi