2013-07-07 2 views
0

아무도 저에게 함수 내의 이름이 함수 밖의 이름 변수와 관련이없는 이유를 이해하는 데 도움이 될지 궁금합니다. 함수 내에서 name의 전역 변수를 변경하려면 어떻게해야합니까?함수 내 변수들 혼란

var name = "Paul"; 

function test(name){ 
    name = name || 'You'; 
    console.log(name); 
} 

test('Mario'); 

console.log(name); 

업데이트 : 빠른 답장을 보내 주셔서 감사합니다. 그래서 당신이 그것을 한 줄씩 돌리면 무슨 일이 벌어 지나요?

마리오를 함수에 전달하면 모든 name 인스턴스가 함수에 전달 된 이름으로 바뀝니 까?

test(); 

그런 = 이름입니다하지 않습니다 당신은 아무것도 통과하지 않는 경우

"Mario" = "Mario" || 'You'; 

을하지만 : 그래서 결국 당신은 얻을? 왜 그것이 걸릴까요? | 성명서?

+0

당신이 호출 할 수 없습니다 함수 매개 변수 다른 방법 : 여기

샘플입니까? –

+0

그 변수가 정말로 전역 변수라면, 그렇지 않다면, 브라우저 환경에 있다고 가정 할 때'window.name'을 사용하여 변수를 참조 할 수 있습니다. –

+0

@ go-oleg : 전역 범위에 있다면 다소 흥미로울 수 있습니다 :'window.name'은 이미 [완전히 다른 것]으로 사용됩니다 (https://developer.mozilla.org/en-US/). docs/Web/API/window.name). – icktoofay

답변

2
var name = "Paul"; 

function test(nameInput){ 
    name = nameInput || 'You'; 
    console.log(name); 
} 

중요한 문제는 같은 이름의 로컬 변수와 전역 변수가 있다는 것입니다. 지역 변수는 전역 변수보다 우선합니다. 둘 모두를 참조 할 수 있도록 입력 변수의 이름을 변경하십시오.

+0

왜 투표가 늦습니까? – TGH

+0

나는 downvote하지 않았지만 약간의 설명이 필요하다고 생각한다. – icktoofay

+0

동의합니다. 더 많은 텍스트로 업데이트되었습니다. – TGH

0

문제가 있습니다. main 변수는 글로벌 변수 name (그림자)의 가시성을 없앱니다. 따라서 전역 인수에 액세스하려면 인수의 이름을 변경해야합니다.

1

name이라는 전역 변수와 name이라는 함수 매개 변수가 있습니다. test을 호출하면 name 매개 변수는 전역 변수를 섀도 잉하는 로컬 변수가됩니다. 전역 변수에 액세스하려면 변수 이름 중 하나를 변경하여 로컬 변수/매개 변수가 전역 변수를 음영하지 않도록해야합니다.

0

함수에서 name으로 변경하면 함수에 국한됩니다. 전역 변수를 변경하려면 함수에서 변경된 name을 반환해야합니다. 매개 변수에 대해 다른 이름을 사용 말하는 모든 사람을 위해

function test(name){ 
    name = name || 'You'; 
    console.log(name); 
    return name; 
} 

name = test('Mario'); 

, 당신은 당신이 범위에 대해 혼란스러워하는 경우에 실행하고 글로벌 및 로컬 변수를 혼합 할 수 does't 주소 모든 문제가.

OP는 Python dict get() method처럼 작동하는 기능을 원합니다. 범위를 계산하면 함수는 일반적으로 모든 값에 대해 작동 할 수 있습니다. 매개 변수 이름을 변경하면 하나의 전역 변수에서만 작동하는 함수가 생깁니다.

+1

나는 그들이 범위에 대해 혼란스러워하지 않는다고 확신한다. 전역 변수의 값을 변경하는 대신 값을 반환하도록 실제로 변경할 수 있지만 전역 변수의 값을 변경하는 함수가 필요한 경우가 있습니다. 함수의 이름이'changeName'이라면 어떻게 될까요? 그런 식으로하는 것이 나쁜 디자인이라고 주장 할 수는 있지만 질문에 관한 것은 아닙니다. – icktoofay

+0

한 돌로 두 마리의 새를 죽이지 않는 이유는 무엇입니까? 문제의 범위는 범위에 관한 것이고 범위를 이해하면 디자인이 개선되어야합니다. 따라서 나쁜 디자인으로 이끌어내는 제안을하지 않겠습니다 :-) –

+0

안녕하세요, 제 질문에 답변 해 주셔서 감사합니다. 이것은 정말 혼란스러운 예였습니다. 이름 짓기는 끔찍한 것이 었습니다.하지만 실제로 장면 내에서 어떤 일이 일어나고 있었는지 알기를 원했습니다. 마치 단순히 함수 내에서 다른 전역 변수를 설정하는 것처럼 보이지 않게되었습니다. – MarioD

0

"name"변수는 함수의 로컬 범위에서 다시 정의됩니다.

원하는대로 작동하려면 전역 변수를 다른 값으로 설정할 수 있도록 로컬 변수의 이름을 다르게 지정해야합니다.

var name = "Paul"; 

function test(newName){ 
    name = newName; 
    console.log(name); // is now Mario 
} 

test('Mario'); 

console.log(name); // reads Mario from the global variable