2015-01-10 2 views
-2

내부 변수와 동일한 이름을 가진 전역 변수 x가 있습니다. 테스트 함수를 실행할 때 전역 변수와 동일한 함수도 실행합니다 이 함수는 함수의 이름과 동일한 이름을 가진 변수에 assigns 값을 포함합니다. 다음 줄에 x의 값을 알리면 2로 경고하지만 테스트 함수를 실행 한 후에는 경고 할 때 x는 여전히 10 ... y라고 경고합니다.javascript : 동일한 변수 이름과 함수 이름

eg 
var x =10;  //assigns value 10 to global variable x 
function test(){ 
    function x() { 
    x = 2; //assigns value x 
    alert(x); // x =2 
    } 
    x(); //calls x 
} 

test(); //call function test 

하지만 당신은 경고 X, 다음 10 ... 를 제공하는 경우 왜 이런; 이

var y =10; //assign value 10 to y 
function test(){ 
    function x() { 
    y = 2; //assign value 2 to y 
    alert(y); //alerts y is 2 
    } 
    x(); //call the function x 
} 

test();  //call the test function 

좋아해요와 y를 선택하면 다음 또한 2 .. 이 둘 사이의 차이는 무엇 인 경우

가와 .. 나는 두 번째의 행동을 알고 .. 은 그러나 첫 번째 것에 대해서는 전혀 모릅니다 ...

+1

함수 이름과 일치하는 변수 이름이있는 이유가 있습니까? –

+1

수신 된 지혜는 'i'또는 'x'를 사용하지 않고 더 많은 의미를 지니고 있다는 것입니다. 식별자를 복제하는 것만 빼면 어떻게 읽을 수 있습니까? 처음에 합리적인 이름을 선언했다면이 질문으로 시간을 낭비하지 않았을 것입니까? 아니면 구멍을 고르려고하십니까? –

답변

0

function 키워드는 var과 유사합니다. 둘 다 그들이 정의한 이름을 로컬 변수로 만듭니다. 따라서 두 개의 x 변수가 있습니다. 범위가 test 함수 외부에 있고 범위가 함수 안에 있습니다. 내부에 할당 된 x은 바깥 쪽 x에 영향을 미치지 않습니다.

두 번째 버전에서는 함수 내에 에 대한 var 또는 function 선언이 없으므로 전역 변수에 액세스합니다. 자세한 내용

는 함수 선언 두 가지 않는

What is the scope of variables in JavaScript?

1

참조 : 그것은

  1. 가 선언을 함수와 같은 이름을 가진 전류 범위에서 새로운 변수 (). 이것은 var x과 같습니다.
  2. 함수를 생성하고 해당 변수에 할당합니다. 이것은 승강기를 제외하고는 x = function x() { ... }과 같습니다. 첫 번째 예

x 대한 함수 선언 test의 범위에서 가변 x를 생성하므로 다른 떠나는 동안 x = 2;, 넌 2x함수 포인터를 덮어 때 변수 x (더 넓은 범위에 존재하며 변수 10 만 보유 함).

이 입증 될 수있다 :

var x = 10; 
 

 
function test() { 
 
    function x() { 
 
    x = 2; //assigns value x 
 
    } 
 
    alert("x inside test before calling x(): " + x) 
 
    x(); //calls x 
 
    alert("x inside test after calling x(): " + x) 
 
} 
 

 
alert("x outside test before calling test(): " + x) 
 
test() 
 
alert("x outside test after calling test(): " + x)
번째 예에서

함수는 y라고, 그래서 좁은 범위에 새로운 x을 만들지 않고 x = 2는 접촉 원본 x.

+0

'test()'를'alert (test)'로 대체하면 Firefox에서 함수 본문의 문자열 표현을 얻습니다 : http://jsbin.com/gicuhayifi/1/edit?html,output - 사실이 아닌 경우에도 잘못된 범위를보고 있기 때문에 "x"가 "함수 값"에 할당되지 않았 음을 알 수 없습니다. 비교를 위해서 : http://jsbin.com/yecuxuceqe/1/edit – Quentin

+0

파이어 폭스에서, 첫번째 함수의'alert()'은'2' (10이 아닌)를 알려줍니다. 'test()'에서'x()'를'return (x()) '로 변경하면 * 정의되지 않습니다. 그래서 여기서'x'는 함수 값에 할당되지 않았고'test()'를 호출 한 후에도 전역'x == 10'이 여전히 유효한지 확인함으로써 로컬'(var) x'를 참조합니다. –

+0

'x()'를'return (x())'로 변경하면 * x의 값이 아닌'x()'*의 반환 값을 반환합니다. 'x' 함수는 return 문을 가지고 있지 않으므로, 그 동작은 예상됩니다. – Quentin

관련 문제