2015-01-09 4 views
0

나는 다음과 같은 코드 블록이있어 : 개인 변수가 콘솔에 표시됩니까?

(function(){ 
    a = 1; 
    alert(a); 
})(); 

내가 크롬에서 콘솔을 열

, 나는 1의 값으로, 변수 a를 볼 수 있습니다. 그것이 IIFE에 있기 때문에 보이지 않아야합니까? 당신은 a를 선언하지, 그래서 문 a = 1; 전역 변수가 아닌 지역을 작성

enter image description here

답변

2

이 코드는 The Horror of Implicit Globals에 먹이를 떨어지고있다. (. 느슨한 모드에서는 다행히, 요즘 우리는 매우 이상한 행동이 항상 있었어야 오류로 변경시킨 엄격 모드을 보유하고 있습니다.)

당신이 a 앞에 var을 추가하는 경우 :

var a = 1; 

... 비공개이므로 해당 기능 내의 중단 점에서 일시 중지되면을 제외한 을 콘솔 내에서 액세스 할 수 없습니다. 함수 내의 중단 점에서 일시 중지 된 경우 함수 범위 내의 모든 항목이 콘솔의 범위에 있습니다 (콘솔을보다 유용하게 만들 수 있음).

그것은 실수로 느슨한 모드에서 글로벌 변수를 생성 정말 쉽게 입니다 : 당신이

function foo() { 
    var niftySpiffyThing; 

    // ... 

    niftySpiffything = 42; 

    // ... 
} 

전화 foo 한 번 이 글로벌라고 (때문에 소문자 thing에서 t의) niftySpiffything.

이 습관적으로 스크립트의 상단에 "use strict"을 넣어 또는 함수 내 최초의 표현으로, 엄격 모드를 사용하는 많은 이유 중 하나입니다 : 다음

"use strict"; // Applies to all code in this script 
(function(){ 
    a = 1; 
    alert(a); 
})(); 

또는

(function(){ 
    "use strict"; // Applies only to code within this function 
    a = 1; 
    alert(a); 
})(); 

전역 대신 오류가 발생합니다.

+0

와우, 고마워요! 그것이 IIFE에서도 일어난다는 것을 깨닫지 못했습니다. – FloatingRock

+0

@FloatingRock : 모든 기능에 해당됩니다. :-) –

3

a = 1은 a가 전역 varialbe임을 의미하며 개인용이 아닙니다. 쓰기

var a = 1; 

비공개로 설정하십시오.

var을 생략하면 쉽게 전역 변수를 만들 수 있습니다. 매우 위험합니다.

일부 자료는 여기에 있습니다 : Difference between variable declaration syntaxes in Javascript (including global variables)?

+0

고마워! 'var a = 1'은 그것을 고쳤습니다 .. 지금부터는 "strict strict"를 사용하고 있습니다. – FloatingRock