글로벌 변수를 사용하지 않고 다른 기능의 변수에 액세스합니다

StackOverflow https://stackoverflow.com/questions/407048

  •  03-07-2019
  •  | 
  •  

문제

나는 다양한 장소에서 글로벌 변수가 본질적으로 불쾌하고 사악하다는 소식을 들었지만, 객관적이지 않은 지향적 인 JavaScript를 수행 할 때는 피하는 방법을 알 수 없습니다. 임의의 숫자와 물건을 사용하여 복잡한 알고리즘을 사용하여 숫자를 생성하는 함수가 있지만 콜백 또는 무언가 인 다른 기능에서 특정 숫자를 계속 사용해야하므로 동일한 기능의 일부가 될 수 없습니다.

원래 생성 된 숫자가 로컬 변수 인 경우 액세스 할 수 없습니다. 함수가 객체 방법 인 경우 숫자를 속성으로 만들 수는 있지만이를 수행하기 위해 전체 프로그램 구조를 변경하는 것이 다소 복잡한 것 같습니다. 글로벌 변수가 정말로 나쁘나요?

도움이 되었습니까?

해결책

함수 B에서 가시적 인 기능 B에서 변수를 계산하려면 세 가지 선택이 있습니다.

  • 그것을 글로벌로 만들고
  • 객체 속성으로 만드십시오
  • A에서 B를 호출 할 때 매개 변수로 전달하십시오.

프로그램이 상당히 작다면 글로벌은 그렇게 나쁘지 않습니다. 그렇지 않으면 세 번째 방법을 사용하는 것을 고려할 것입니다.

function A()
{
    var rand_num = calculate_random_number();
    B(rand_num);
}

function B(r)
{
    use_rand_num(r);
}

다른 팁

여기서 가장 좋은 방법은 하나의 글로벌 스코핑 변수 및 변수를 여기에 덤프합니다.

var MyApp = {}; // Globally scoped object

function foo(){
    MyApp.color = 'green';
}

function bar(){
    alert(MyApp.color); // Alerts 'green'
} 

위와 같은 일을 한 사람은 아무도 당신에게 소리를 지르지 말아야합니다.

네임 스페이스 사용 고려 :

(function() {
    var local_var = 'foo';
    global_var = 'bar'; // this.global_var and window.global_var also work

    function local_function() {}
    global_function = function() {};
})();

둘 다 local_function 그리고 global_function 모든 로컬 및 글로벌 변수에 액세스 할 수 있습니다.

편집하다: 또 다른 일반적인 패턴 :

var ns = (function() {
    // local stuff
    function foo() {}
    function bar() {}
    function baz() {} // this one stays invisible

    // stuff visible in namespace object
    return {
        foo : foo,
        bar : bar
    };
})();

그만큼 returnED 속성은 이제 네임 스페이스 개체를 통해 액세스 할 수 있습니다. ns.foo, 여전히 로컬 정의에 대한 액세스를 유지하는 동안.

당신이 찾고있는 것은 기술적으로 카레링으로 알려져 있습니다.

function getMyCallback(randomValue)
{
    return function(otherParam)
    {
        return randomValue * otherParam //or whatever it is you are doing.
    }

}

var myCallback = getMyCallBack(getRand())

alert(myCallBack(1));
alert(myCallBack(2));

위의 내용은 정확히 카레 기능이 아니지만 글로벌 네임 스페이스에 변수를 추가하지 않고 기존 값을 유지하거나 다른 객체 저장소를 요구하는 결과를 달성합니다.

다른 함수가 변수를 사용해야하는 경우 인수로 함수로 전달합니다.

또한 글로벌 변수는 본질적으로 불쾌하고 악하지 않습니다. 그들이 제대로 사용되는 한 그들에게는 아무런 문제가 없습니다.

이 코드를 재사용 할 가능성이 있다면 아마도 객체 지향적 관점을 가지고 갈 노력을 기울일 것입니다. 글로벌 네임 스페이스를 사용하는 것은 위험 할 수 있습니다. 재사용되는 가변 이름으로 인해 버그를 찾기가 어려울 위험이 있습니다. 일반적으로 나는 간단한 콜백보다 더 많은 것에 대한 객체 지향적 접근 방식을 사용하여 재 작성을 할 필요가 없습니다. JavaScript에 관련 기능 그룹이있을 때마다 객체 지향적 접근의 후보라고 생각합니다.

또 다른 접근법은 Douglas Crockford Forum Post에서 픽업 한 방법입니다.http://bytes.com/topic/javaScript/answers/512361-array-objects). 여기있어...

Douglas Crockford는 다음과 같이 썼습니다.

7 월 15 일 '06

"ID로 객체를 검색하려면 배열이 아닌 객체를 사용해야합니다. 함수도 객체이기 때문에 멤버를 함수 자체에 저장할 수 있습니다."

function objFacility(id, name, adr, city, state, zip) {

    return objFacility[id] = {

        id: id,
        name: name,
        adr: adr,
        city: city,
        state: state,
        zip: zip

    }
}

objFacility('wlevine', 'Levine', '23 Skid Row', 'Springfield', 'Il', 10010);

"물체는"로 얻을 수 있습니다 "

objFacility.wlevine

객체 속성은 이제 다른 기능 내에서 액세스 할 수 있습니다.

원래 질문과 관련하여 이것이 매우 도움이된다는 것을 알았습니다.

FunctionOne에서 사용하려는 값을 반환 한 다음 FunctionTwo 내에서 FunderOne을 호출 한 다음 결과를 Fresh Var로 배치 하고이 새로운 VAR을 FunctionTwo 내에서 참조하십시오. 이를 통해 FunctionTwo 내에서 FunctionOne에서 선언 된 var를 사용할 수 있습니다.

function functionOne() {
  var variableThree = 3;
  return variableThree;
}

function functionTwo() {
  var variableOne = 1;
  var var3 = functionOne();

  var result = var3 - variableOne;

  console.log(variableOne);
  console.log(var3);
  console.log('functional result: ' + result);
}

functionTwo();

귀하의 문제에 대한 세부 사항을 알지 못하지만 기능에 값이 필요한 경우 호출을 통과하는 매개 변수가 될 수 있습니다.

글로벌 스테이트와 다수의 수정자가 코드와 이상한 오류를 따라 가기 어려울 수 있기 때문에 글로벌은 나쁜 것으로 간주됩니다. 많은 배우들에게 무언가로 가득 차면 혼란을 일으킬 수 있습니다.

사용자 정의 jQuery 이벤트를 사용하여 JavaScript 함수의 실행 (및 그들 사이의 변수)의 실행을 완전히 제어 할 수 있습니다 .... 나는 이것이이 포럼 전체에서 불가능하지 않다고 들었지만 정확히 그 일을하는 일이 있습니다. Ajax 호출).

다음은 답변입니다 (중요 : 확인 된 답변이 아니라 오히려 "Emile"의 답변) :

여러 기능에서 변수를 반환하는 방법 -JavaScript/JQuery

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top