2016-09-17 1 views
0

이 주제에 대한 다른 질문을 많이 읽었습니다. 전역 범위에서 변수 varA을 내 함수 외부에 선언하면 전역 함수이므로 모든 함수가 액세스하고 사용할 수 있습니다. 그렇죠?함수 내에서 전역 변수를 업데이트 할 수없고 그 외부에서 호출 할 수 없습니다. (jQuery)

이제는 함수 외부에서 변수를 선언하고 함수 외부에서 변수를 선언 할 때이 예제를 사용하지만 함수 외부에서 호출하면 undefined으로 표시됩니다. 여기에서 함수 내부에서 호출 할 수 있습니다. , 그것은 바뀐다. 이것은 나에게 논리적하지 않는 것

$(document).ready(function() { 

    var varA; 

    $(function() { 

     varA = 'varA has been altered!'; 

     alert(varA); //displays 'varA has been altered!' 

    }); 

    alert(varA); //displays 'undefined' 
}); 

: 내가 전역 변수를 변경할 때,해야하지 두 번째 alert(); 디스플레이 varA의 가치인가?

이 문제의 해결 방법은 무엇입니까? 함수 내에서 전역 변수를 변경하고 함수 외부에서 그 값을 얻으려면 어떻게해야합니까?

건배

편집 : 내가 하나 개 이상의 기능에 varA에 액세스 할 수 있어야합니다, 그래서이 $(function() {});

답변

2

전에 선언해야

문제가있을 것입니다 varA에 액세스하기위한 경쟁 조건 : $(function() {}); 아래의 코드가 함수 내부의 코드보다 먼저 실행되면 정의되지 않습니다.

이 경우 $(document).ready()$()과 동일하므로 document은 이미 함수 내에 준비되어 있어야합니다. 여기에 범위 지정이 유사한 예,하지만 경쟁 조건이 제거되기 때문에 코드가 작동합니다 :

$(function() { 
    var varA; 
    var def = $.Deferred(); 
    def.then(function() { 
     varA = 'varA has been altered!'; 
    }).then(function() { 
     alert(varA); //displays 'varA has been altered!' 
    }); 

    def.resolve(); 
}); 
+0

'varA'가 함수 내에 선언되었으므로 전역 범위에서 여전히 액세스 할 수 있습니까? 함수 밖에서 사용할 수 있습니까? –

+0

변수가 함수 범위에 바인딩되어 있으므로 사용할 수 없습니다. 함수 밖에서 액세스하고 싶으면 외부에 선언하십시오. – mc10

+0

함수 위에 문자 'varA'를 문자 그대로 선언하면 여전히 undefined ('var varA; $ (function() {...}))'로 표시됩니다. –

0
따라서, 당신은이 범위 지정에 문제가되지 않습니다

$(function() { 
    var varA; 

    varA = 'varA has been altered!'; 
    alert(varA); //displays 'varA has been altered!' 
}); 

를 실행할 수 있습니다

@ mc10이 언급했듯이 이것은 주로 varA에 액세스하기위한 경쟁 조건으로 인해 발생합니다. $(document).ready()readystatechange 이벤트가 콜백되기 전에 준비가 완료 될 때까지 대기하지만, setTimeOut을 실행하여 readystatechange 이벤트가 이미 실행되었는지 확인하기 때문에 발생합니다.

따라서 원하는 번호 :

$(document).ready(function(){ 
    a(); 
    $(b); 
    c(); 
}); 

순서

  1. C

  2. B

에서 실행할
0

기본적으로 javascript 변수는 값으로 'undefined'를 가져옵니다. 일부 값이 할당 될 때까지입니다. 이 경우 내부 함수가 먼저 실행되지 않고 경고가 먼저 실행되고 그 시간에 변수의 값이 'undefined'이므로 동일한 값을 얻습니다.

다음을 시도해보십시오.

 $(document).ready(function() { 

     var varA; 

     (function() { 

      varA = 'varA has been altered!'; 
      console.log(varA); //displays 'varA has been altered!' 

     }()); 
     console.log(varA); //displays 'varA has been altered!' 
    }); 
관련 문제