2011-06-13 3 views
2

내가 원하는 것은 두 핸들러간에 데이터를 보내는 것입니다.어떻게 캐시/사전 계산 (전역 변수없이)?

element.onmousedown = function() { 
    data = precalculate(); 
} 

element.onmouseup = function() { 
    dosomething(data); 
} 

data가 작동 전역 변수 인 경우. 사람들은 지구 변수가 악하다고 말합니다. 그러나 나는 그것없이 어떻게 해야할지 모른다.

또는 "전역 변수"를 잘못 이해 했습니까?

답변

5

그냥 범위 변수는/원하지 않는 경우는 글로벌해야 :

(function() { 
    var data; 
    element.onmousedown = function() { 
     data = precalculate(); 
    } 

    element.onmouseup = function() { 
     dosomething(data); 
    } 
})(); 

편집 : 명확하게하기 위해 자바 스크립트에서 새 변수 범위를 만드는 유일한 방법은 함수에 있습니다.

함수 내에 var으로 선언 된 변수는 외부 범위에서 액세스 할 수 없습니다. 위의 코드에서

는, 나는 인생을 만들어 단지가 생성되는 즉시 호출되는 함수이고, 나는 배치 (즉시 호출 함수 표현식), 당신의 변수 data (핸들러 지정과 함께) 그것의 내부.

핸들러는 data 변수에 액세스 할 수있는 범위에서 작성 되었기 때문에 해당 변수에 대한 액세스를 유지합니다.

는 또 다른 예를 제공합니다 :

var a = "a"; // global variable 

(function() { 

    var b = "b"; // new variable in this scope 

    (function() { 

     var c = "c"; // new variable in this scope 

     // in this function, you have access to 'a', 'b' and 'c' 

    })(); 

    // in this function you have access to 'a' and 'b' variables, but not 'c' 

})(); 

// globally, you have access to the 'a' variable, but not 'b' or 'c' 
+0

이것이 내가 알고 싶은 것입니다. –

+0

@ 라이 : 기꺼이 도와 드릴 수 있습니다. 또 다른 변수 범위 예제를 추가했습니다. – user113716

3

이 경우 전역 변수가 적합합니다. 또 다른 가능성은 DOM 요소에 값을 첨부하는 것입니다.

element.onmousedown = function() { 
    // 'this' should point to the element being mouse downed 
    this.data = precalculate(); 
}; 

element.onmouseup = function() { 
    // 'this' should point to the element being mouse upped 
    var data = this.data; 
    dosomething(data); 
}; 
0

"글로벌 변수가 잘못되었습니다"라고 오해했습니다.

실제로 실제로 일어난 일은 누군가가 "군중의 일부"가되기를 원했고, 실제로 적절한 경우 전역 변수 만 사용해야한다고 말하면서 일반적인 일반화를 말한 것입니다.

글쎄, 여기에 적합합니다. 내 친구.

+1

모든 청소 일반화는 악! ; o) – user113716

0

JQuery와는 .DATA를 사용하여 가능한이 만드는() 함수 :

http://api.jquery.com/jQuery.data/

+0

여기에 jQuery가 사용되었다는 표시가 없습니다. – user113716

+0

나는 해결책을 제시하고 있었다. – kinakuta

+0

@user : 언어 자체 내에서 쉽게 해결할 수있는 단일 필요성 때문에 전체 라이브러리를로드하는 것은 의미가 없습니다. – user113716

0

당신은 최소로 유지 당신이 하나의 글로벌 네임 스페이스에 물건을 배치 할 수 있습니다 예를 들어, 당신은 멀리 한 글로벌 변수를 사용으로 얻을 수 있습니다 :

App = {}; 

element.onmousedown = function() { 
    App.data = "hello"; 
} 

element.onmouseup = function() { 
    console.log(App.data); 
} 
0

또 다른보다 일반적인 해결책은 메모 작성이라는 기술을 사용하여 결과를 캐시하는 기능을 만드는 것입니다. 검색하면 많은 것들이 있습니다. 다음 코드는 정확하게 해당 코드를 수행합니다.

Function.prototype.memoize = function() { 
    var fn = this; 
    this.memory = {}; 
    return function() { 
     var args = Array.prototype.slice.call(arguments); 
     return fn.memory[args] ? fn.memory[args] : fn.memory[args] = fn.apply(this, arguments); 
    }; 
}; 

exfunc라는 값 비싼 함수가 있습니다.

newFunc = exfunc.memoize(); 

상기 문은 실제 코드가 실행되는 최초 이후의 모든 호출이 로컬 캐시에서 검색되도록 원본 함수의 결과를 캐시 newFunc라는 새로운 기능을 생성한다.

이것은 대부분 반환 값이 전역 상태에 의존하지 않는 함수에서 작동합니다.

상세 정보 : http://osteele.com/archives/2006/04/javascript-memoization

관련 문제