장식공 주문

5797 단어 javascript-decorators

묘사

은 다음과 같은 코드가 있다고 가정합니다.
function foo(value) {
  return function (target, key, descriptor) {
    target.foo = value;
  };
}

class Base {
  @foo(3)
  @foo(4)
  bar() {

  }
}

let b = new Base();
console.log(b.foo);
출력은 뭘까요?3 또는 4 또는 우리는 규범에서 그것을 지정하지 않습니까?

토론 #1

3
2015년 5월 31일 일요일,Gray [email protected]쓰기:

Suppose we have this code:

function foo(value) { return function (target, key, descriptor) { target.foo = value; }; } class Base { @foo(3) @foo(4) bar() {

} } let b = new Base();console.log(b.foo);

What should be the output? 3 or 4, or we just don't specify it in spec?

Reply to this email directly or view it on GitHub https://github.com/wycats/javascript-decorators/issues/20.



세바스티안 맥켄지(Sebastian McKenzie)

토론 #2

은 장식사들을 상세하게 평가했다.이것은 인테리어공의 공로이다
설명자를 둘러싼 함수 호출입니다. 이것은 내부를 의미합니다.
안에서 처형되다.
2015년 5월 31일 일요일,Gray [email protected]쓰기:

Closed #20 https://github.com/wycats/javascript-decorators/issues/20.

Reply to this email directly or view it on GitHub https://github.com/wycats/javascript-decorators/issues/20#event-318213269 .



세바스티안 맥켄지

토론 #셋

which means the inside gets executed before the inside outside


우연히 이 후진이 먼저 내놓은 서프라이즈를 발견했을 뿐이다.다른 언어는 장식 프로그램의 순서를 뒤바꿉니까?Python ? wycats 짱이다. Ruby prior art?Perl ?
이것은 정말 직감에 어긋나는 것 같다.
@foo(1)
@foo(2)
@foo(3)
method () {
    // ...
}
- 결과 표시(babel++):
_createDecoratedClass(Foo, [{
    // ...
    decorators: [foo(3), foo(2), foo(1)],
    // ...
}]);
지금 이 문제를 재고/해결하기에는 이미 늦었습니까?개발자가 지정한 어휘, 뚜렷함(IMO) 순서를 뒤바꾸면 어떤 장점이 있습니까?

토론 #4

@chocolaboy 어떤 주문서를 말씀하시는지 말씀해 주시겠어요?
# 궁금해요. 이 말 때문에 좀 놀랐어요.예를 들어 Python에서 decorator 함수 자체는 아래에서 위로 포장 함수로 실행되지만 실제 decorator는 작성할 때 위에서 아래로 계산된다.예컨대
let decorators = [];
decorators.unshift(foo(1));
decorators.unshift(foo(2));
decorators.unshift(foo(3));

_createDecoratedClass(Foo, [{
    // ...
    decorators: decorators,
    // ...
}]);

토론 #5

Could you clarify which ordering you mean?


나는 그것들이 쓰기 순서에 따라 적용되기를 바란다. 즉, 내가 가정한 것이다.
@foo(1)
@foo(2)
@foo(3)
method () {
    // ...
}
foo이 1, 2, 3으로 순차적으로 호출됩니다.
foo(1)
foo(2)
foo(3)

토론 #6

the desugared version그것은 F(G(original))으로 변했다.

토론 #7

@yuchi
고맙습니다.나는 이것이 어떻게 된 일인지 알지만, 나는 이렇게 하면 무슨 좋은 점이 있는지 알고 싶다.

토론 #8

@chocolaboy Decorators는 아래에서 위로 응용된다. 기존의 방법/설명자를 둘러싸고 있다고 여겨지기 때문에 개념적으로 보면 밑에 있는 것에 응용되고 밑에 있는 것이 decorator라면 이 decorator가 먼저 응용될 것이다.
class Base {
  @foo(3)
  @foo(4)
  bar() {

  }
}
닮다
class Base {}
Base.prototype.bar = foo(3)(foo(4)(function bar(){});
함수를 직접 사용하지 않고 설명자를 사용합니다.외부 호출은 기본적으로 내부 호출의 반환 값을 덮어씁니다.

토론 #9

@loganfsmyth 고맙습니다. 그게 특징입니다.나는 단지 규범의 기본 원리를 의심하고 있을 뿐이다. -) 나는 왜 이 순서가 지정된/어휘 순서에 따라 장식 함수를 평가하는 것보다 더 뚜렷하고 합리적이며 뚜렷하거나 놀랍지 않다고 여겨지는지 묻고 있다.
나는 장식과 관련된 코드로 이 문제를 해결해야 했다. 이것은 나를 매우 불편하게 했다.만약 장식사가 부작용이 있다면, 이렇게 하면 매우 고통스러울 것이다...
다른 장식기/속성/주석 (자바/Groovy/Kotlin & c 를 추가할 수도 있음) 을 실행하시겠습니까?
우리는 foo@foo 함수를 외부 함수로 호출하고 (target, name, descriptor) -> descriptor? 함수를 내부 함수로 호출할 것이다.만약 내가 this을 읽는다면, TypeScript는 위에서 아래로/FIFO로 외부 함수 (계산) 를 실행하고, 아래에서 위로/LIFO로 내부 함수를 실행합니다.바벨은 현재(5.8.3) bottom-up order의 외부 기능을 수행하고 있다.나는 이 두 함수가 모두 어휘의 위에서 아래로의 순서로 집행되는 것을 더욱 좋아하지만, 외부 함수가 적어도 위에서 아래로 집행된다면 나는 매우 감사할 것이다.
아마도 나는 다른 문제를 제기해야 할 것이다. 왜냐하면 이 문제는 이유를 토론하는 것이 아니라 해명을 요구하기 때문이다.그 밖에 이 문제는 이미 끝났지만, 나에게 있어서 이것은 매우 좋은 제안/기능 중의 아픔이다.나는 점점 더 많은 사람들이 그것을 사용할수록 다른 사람들을 물어뜯을 것이라고 생각한다.

토론 #10

@chocolaboy-Gotcha, 이것이 바로 내가 처음으로 평론하고 이해하고자 하는 것이지만, 나는 그것의 표현이 최종적으로 사람을 곤혹스럽게 하고 분명하게 말하기 어렵다고 생각한다.나는 너의 견해에 동의한다. 나는 바베타에서 장식사 표현식의 계산 순서가 틀렸다고 생각한다.신청했어요.https://github.com/wycats/javascript-decorators/issues/28이 점을 명확히 하기 위해서 나는 이 문제가 더욱 구체적으로 말하면 장식 함수 자체가 호출되는 순서 집행에 관한 것이라고 생각한다.

토론 #11

I filed #28 to clarify that specifically since I think this issue is more specifically about the order execution for the decorator functions themselves are called.


고맙습니다.나는 나의 게시물 뒤에서 이 점을 발견하고 이미 구독했다.나는 그 원리를 토론하기 위해 new issue을 만들었다.

좋은 웹페이지 즐겨찾기