문제

나는 아직도 with 키워드 조금 ...수수께끼 같은.

간단히, with 다음과 같이 행동합니다.

with (obj) {
    // do stuff
}

이것은 추가됩니다 obj 스코프 체인의 헤드에 다음 블록을 실행합니다. 블록이 완료되면 제거됩니다 obj 스코프 체인의 헤드에서.

에 따르면 MDC, 이것은 당신이 같은 일을 할 수 있습니다

var a, x;
var r = 10;
with(Math) {
    a = PI * r * r;
    x = r * cos(PI / 2);
}

따라서 속성을 참조 할 수 있습니다 Math -- 처럼 PI - 말하지 않고 직접 Math.PI. 괜찮지 만 쓸모가 없습니다.

누구나 흥미로운 사용의 예를 제공 할 수 있습니까? with?

도움이 되었습니까?

해결책

for 루프 내부의 함수를 사용하여 표준 클로저 솔루션에 대한 대안 :

<a  href="#">blah</a><br>
<a  href="#">blah</a><br>
<a  href="#">foo</a><br>
<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
        for ( var i = anchors.length; i--; ) {
            var link = anchors[i];
            with ({ number: i }) {
                link.onclick = function() {
                    alert(number);
                };
            }
        }
    })();
</script>

신용 nlogax 거의 찢어진 솔루션을 제공합니다.JavaScript 악명 높은 루프 문제?

표준 솔루션은 다음과 같습니다.

<script>
    (function() {
    var anchors = document.getElementsByTagName('a');
    for ( var i = anchors.length; i--; ) {
        var link = anchors[i];
        (function(i) {
            link.onclick = function() {
                alert(i)
            }
        })(i);
    }
    })();
</script>

다른 팁

여기서 말해야합니다 with JavaScript의 진술은 널리 사용되지 않습니다.

Douglas Crockford 's를 참조하십시오 성명서와 함께 해로운 것으로 간주됩니다.

나는 그가 한 것보다 더 잘 말할 수는 없지만 (진지하게, 링크를 따르십시오), 당신이 이것을한다면 간단히 말해.

with (mySuperLongObjectReferenceThatIHateTyping) {
  propertyAlpha = 'a';
  propertyBeta = 2;
  propertyGamma = false;
}

MySuperLongobjectreenceThateTeTeTyping 객체 또는 전역 객체 (창)의 속성에 값을 할당하는 경우 해당 코드를 보면 알 수 없습니다.

Crockford는 다음을 권장합니다.

var o = mySuperLongObjectReferenceThatIHateTyping;
o.propertyAlpha = 'a';
o.propertyBeta = 2;
o.propertyGamma = false;

명백합니다. 또는 범위를 가지고 다른 글로벌 변수를 생성하지 않도록 함수를 사용할 수도 있습니다.

(function(o) {
  o.propertyAlpha = 'a';
  o.propertyBeta = 2;
  o.propertyGamma = false;
})(mySuperLongObjectReferenceThatIHateTyping);

John Resig의 JavaScript Microtemplating 함께 흥미로운 용도를 보여줍니다.

나는 정기적으로 그것을 사용하여 여러 CSS 속성을 추가합니다. style 대상, 예를 들어

with(document.body.style) {
    color = 'green';
    background = 'red';
}

또한, 나는 그것을 사용했습니다 적어도 한 번 객체 자체에 대한 참조를 저장하지 않고도 객체의 속성을 로컬 변수에 할당합니다.

또한 변수의 값에 대한 '스냅 샷'을 취하려면 폐쇄의 대안입니다.

var foo = [];
for(var i = 10; i--;)
    with({ i : i }) foo[i] = function() { document.writeln(i); };

// prints 0..9
for(var i = 0; i < foo.length; ++i)
    foo[i]();

그것을 명심하십시오 with 변수 이름을 해결할 때 어휘 환경에 추가 한 객체의 프로토 타입 체인을 먼저 점검해야함에 따라 성능에 심각한 영향을 줄 수 있습니다.

JS의 명령문은 vb.net의 명령문과 같습니다. 객체의 속성 / 방법으로 반복을 피하는 방법입니다.

예를 들어, 이벤트 / 동작에 따라 레이블 컨트롤이 수정되고 있다고 가정합니다. 해당 레이블 컨트롤에는 FontColor, CSSCLASS, 가시성 등과 같은 속성이 있습니다.

프로그래머 쓰기 대신 :

myLabel.FontColor=Color.Blue
myLabel.CSSClass="SomeCSSClass"
myLabel.Visiblity=True
myLabel.Text = "Hello World"

우리는 그것을 단축 할 수 있습니다.

With myLabel
  .Text = "Hello World"
  .FontColor = Color.Blue
  .CssClass="SomeCSSClass"
  .Visibility=True
End With

나는 JavaScript에서 경험이 없었기 때문에 사용해야한다고 생각하는 방법을 이해하기 시작 했으므로 특정 언어에서 경험 한 사람과 같은 무게를 가지고 있지 않아야합니다. 나는 내 아이디어에 대한 응답에 관심이있을 것입니다.

나는 JavaScript에 의존하는 클래스와 같은 객체를 정의하는 스타일을 실험하고 있습니다. ~와 함께 성명. 나는 이것이 합법적 인 사용이라고 제출합니다.

이 스타일의 각 클래스와 같은 객체는 물체가 어떤 목적을 충족시키기위한 공장으로 기능합니다.

이 스타일은 사용하지 않습니다 이것 예를 들어 메소드의 키워드.

이 스타일은 이러한 클래스와 같은 객체 중 하나에서 생성 된 각 객체가 공개적 측면과 개인 측면을 갖는 것이라고 생각합니다. JavaScript 객체는 이러한 각 측면을 나타냅니다. 대상에 대한 참조 보유자는 실제로 대중의 측면만을 나타냅니다. 그러나이 방법은 두 측면을 모두 알고 있으며 폐쇄로이를 구현합니다.

이 스타일이 런타임 시간 또는 메모리 성능에 대해 많은 관심을 갖는 경우에 적용 할 수 있다고 생각하지 않습니다. 나는 의도적으로 프로그래밍 효율성에 대한 각각의 사람들을 상당히 희생시킵니다. 나는 무언가를 신속하고 실수 할 가능성이 거의없고 런타임의 요구가 중요하지 않은 곳에서 무언가를 프로그래밍하고 싶은 많은 사례를 찾을 것으로 기대합니다.

Node.js가 아닌 브라우저에서 코드를 시도해 왔기 때문에 큰 소스 파일의 구문 오류가 고정되어 수정하기가 어려울 수 있다는 것입니다. 코드를 작은 단위로 추가 하여이 문제에 대응합니다. 따라서 모든 메소드 정의가 하나의 소스 파일에 나타나도록 요구하지 않고 클래스와 같은 객체가 한 번에 인스턴스 메소드 정의를 수락 할 수 있기를 원합니다.

인스턴스 방법에 정의 된 인스턴스 방법없이 클래스와 같은 객체를 선언하고 클래스와 같은 객체를 프로그래밍하는 네임 스페이스에 배치합니다.

그런 다음 "init"라는 메소드에서 클래스와 같은 객체를 반복적으로 호출하고 매번 통과합니다. 이니셜 라이저, 인스턴스 초기화 중에 호출되는 함수.

결국 클래스와 같은 객체를 인스턴스의 공장으로 사용하기 시작하면 새로운 사례를 요청할 때마다 인스턴스의 공개 및 개인 측면을 생성하고 개인 측면을 공개 측면에 연결 한 다음 모든 것을 호출합니다. 정의 된 초기화기는 새 인스턴스의 개인 측면을 전달합니다.

내 스타일에서 모든 공개 속성은 방법입니다. 함수가 아닌 값이없는 모든 변수는 개인 측면에서 살아야합니다.

이니셜 라이저가 할 수있는 한 가지는 개인 측면에서 변수를 설정하는 것입니다.

이니셜 라이저가 할 수있는 또 다른 일은 대중이나 개인 측면에 메소드를 추가하는 것입니다.

순서는 이니셜 라이저를 실행하기위한 문제-클래스와 같은 객체는 정의 된 것과 동일한 순서로 실행해야합니다. 결과적으로, 각 이니셜 라이저는 초기 초기화기가 설정 한 속성을 갖는 인스턴스의 공개 및 개인 측면에 의존 할 수 있습니다. 프로그래머의 경우, 초기화기는 어떤 종류의 조건부 또는 동적 코드에 의해 설정되지 않기 때문에, 이것은 사실상 어휘 스코프를 생성합니다. 소스 파일이 브라우저가 읽고 구문 분석 한 직후 브라우저에서 실행되면서 설정됩니다.

이제 일부 언어, 특히 루비 언어와 자체 언어에서는 알몸 식별자를 작성하고 현재 객체의 메소드 호출로 해석 할 수 있습니다. 루비에서 "foo"는 "self.foo"를 의미 할 수 있고 자아 "foo"는 "self foo"를 의미 할 수 있습니다 (메소드 콜의 구문은이 언어마다 다르지만 내가 말하는 세부 사항 수준까지 현재 의미론 중, 루비의 "self.foo"와 "self foo"는 동일합니다). "자기"가 존재하지 않는이 약어는 개인 방법과 인스턴스 변수를 호출하는 데 특히 편리합니다. JavaScript 언어는이 편의를 제공하지 않습니다.

개인 또는 공개 측면의 값을 사용하려는 인스턴스 메소드 내부의 상황에서 (과제의 왼쪽이 아닌 참고) 이름으로 속성을 참조하는 편의를 좋아합니다. "vars"를 쓸 필요가 없습니다. 또는 "자기." 그것을 찾기 위해 그것의 왼쪽에 (나는 개인적 측면에 "Vars"를 사용하고 공개 측면에 "자기"). 이런 이유로 각 이니셜 라이저를 JavaScript로 랩합니다. ~와 함께 성명. 내 스타일에서 타겟팅 된 대상의 모집단이 어휘로 확립되어 있기 때문에 이것은 합법적 인 것 같습니다. 속성을 보려면 프로그래머는 소스 파일의 앞부분에서 제공된 이니셜 라이더를 동일한 클래스와 같은 객체 (소스 코드에서 이름으로 식별하므로 소프트웨어 엔지니어링 목적으로 우리는이를 다음과 같이 간주 할 수 있습니다. JavaScript Parsers가 이것을 감지하지 않더라도 어휘 개체.

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