Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[찬우] globalThis 번역 #32

Merged
merged 46 commits into from
Jun 21, 2023
Merged
Changes from 32 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
3900c88
ko : proposal-object-getownpropertydescriptors 번역 완료
Mar 14, 2023
2ccb500
summary : proposal-object-getownpropertydescriptors 요약 1차 완료
chanuuuuu Mar 15, 2023
b799a26
Merge branch 'main' into main
chanuuuuu Mar 15, 2023
cc5f6e9
Merge branch '11st-corp:main' into main
chanuuuuu Mar 18, 2023
85c49b7
summary : proposal-object-getownpropertydescriptors proto 관련 내용 추가
chanuuuuu Mar 18, 2023
8ee2e0f
summary : proposal-object-getownpropertydescriptors appendix 추가
chanuuuuu Mar 18, 2023
8ab1f70
summary : proposal-object-getownpropertydescriptors appendix 수정
chanuuuuu Mar 18, 2023
8ab4025
summary : proposal-object-getownpropertydescriptors appendix Object.a…
chanuuuuu Mar 20, 2023
2a38a08
ko : proposal-dotAll-flag-for-reglar-expressions
chanuuuuu Mar 20, 2023
193181c
delete : proposal-dotAll-flag-for-reglar-expressions branch 분리를 위한 삭제
chanuuuuu Mar 20, 2023
4a21a62
Merge branch 'main' into main
chanuuuuu Mar 22, 2023
1104c24
Update src/ko/proposal-object-getownpropertydescriptors.md
chanuuuuu Mar 22, 2023
d855099
Update src/ko/proposal-object-getownpropertydescriptors.md
chanuuuuu Mar 22, 2023
f98c490
Update src/ko/proposal-object-getownpropertydescriptors.md
chanuuuuu Mar 22, 2023
46c1716
Update src/ko/proposal-object-getownpropertydescriptors.md
chanuuuuu Mar 22, 2023
f59b405
Update src/ko/proposal-object-getownpropertydescriptors.md
chanuuuuu Mar 22, 2023
f0ba809
Update src/ko/proposal-object-getownpropertydescriptors.md
chanuuuuu Mar 22, 2023
9440594
Update src/ko/proposal-object-getownpropertydescriptors.md
chanuuuuu Mar 22, 2023
65d4860
Update src/ko/proposal-object-getownpropertydescriptors.md
chanuuuuu Mar 22, 2023
d3390a0
Update src/ko/proposal-object-getownpropertydescriptors.md
chanuuuuu Mar 22, 2023
1343dec
ko : proposal-object-getownpropertydescriptors 번역 수정
chanuuuuu Mar 22, 2023
12733da
summary : proposal-object-getownpropertydescriptors-appendix 추가 수정 (미완)
chanuuuuu Mar 22, 2023
b8c7115
Merge branch '11st-corp:main' into main
chanuuuuu Mar 27, 2023
a28eab1
Merge branch '11st-corp:main' into main
chanuuuuu Mar 28, 2023
f4f684a
ko : proposal-promise-finally 번역 완료
chanuuuuu Mar 28, 2023
8f86516
Merge branch '11st-corp:main' into main
chanuuuuu Mar 30, 2023
6c5b958
Merge branch 'main' into main
chanuuuuu Apr 4, 2023
7522605
Merge remote-tracking branch 'origin'
chanuuuuu Apr 4, 2023
f1440dd
Merge branch 'main' into main
chanuuuuu May 8, 2023
f6cbbe5
Merge branch '11st-corp:main' into main
chanuuuuu May 10, 2023
05b2be4
Merge branch '11st-corp:main' into main
chanuuuuu May 17, 2023
a72ea6e
summary : proposal-global this 번역
chanuuuuu May 17, 2023
3e4dccc
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
1bbf5bc
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
6590d75
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
65dac6b
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
2b5b3c4
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
8718029
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
de3166a
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
8d1f9bf
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
e3dbb14
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
b7e46ab
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
6de8f75
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
06f175f
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
668ce9d
Update src/ko/proposal-global.md
chanuuuuu Jun 21, 2023
b240a87
Merge branch 'main' into globalThis
chanuuuuu Jun 21, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions src/ko/proposal-global.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# [globalThis](https://www.npmjs.com/package/globalthis)

ECMAScript 제안서와 명세서, `globalThis`의 구현에 대해 담고 있습니다.

[@ljharb](https://github.com/ljharb)가 해당 명세서에 대해서 초안을 작성하였습니다.

이 제안서는 [과정](https://tc39.github.io/process-document/) 중, [4 단계](https://github.com/tc39/ecma262)에 있습니다.

## 이론적 근거
전역 객체에 대한 접근을 위한 간단한 ECMAScript 코드를 작성하는 것이 어렵습니다. 웹에서는 `window`나 `self`나 `this`, `frames`을 통하여 접근이 가능합니다. node.js에서 전역 객체는 `global`이나`this`으로 접근할 수 있습니다. 그 중에서도 `this`는 V8의 `d8`이나 JavaScriptCore의`jsc`과 같은 쉘에서만 사용이 가능합니다. 일반적으로 독립적인 함수를 호출하는 경우, `this`는 사용 가능하지만, 엄격 모드나, 모듈 내에서는 `undefined`를 가집니다. 이러한 방식으로, 전역 객체는 `Function('return this')()`를 통해서 접근이 가능합니다. 하지만 이러한 형식은 Chrome Apps 내부와 같은 몇몇의 CSP 설정에서는 접근이 불가능 합니다. 아래는 즉시 실행함수의 단일 인자로 전달되고 있는 전역객체를 접근하는 코드입니다. 이는 대부분의 경우에는 동작하지만 엄격 모드의 함수 내부이거나 모듈 내일 경우에는 `d8`에서 동작하지 않을 수 있습니다. (`Function` 트릭을 사용하면 고칠 수 있을 수도 있습니다.)
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved

```js
function foo() {
// 만약 브라우저인 경우, 전역 네임스페이스는 'window'라는 이름을 가집니다. 만약 node인 경우, 이름은 'global'입니다.
// 만약 쉘 안이라면, 'this'는 동작할 수 있습니다.
(typeof window !== "undefined" ? window : (typeof process === 'object' && typeof require === 'function' && typeof global === 'object') ? global : this);
}
```

추가적으로, `es6-shim` 은 [CSP 논의](https://github.com/paulmillr/es6-shim/issues/301)로 인해 `Function('return this')()`에서부터 변경이 필요하였습니다. 현재 브라우저들, node, 웹 워커들, 프레임들을 관리하기 위한 [변경점](https://github.com/paulmillr/es6-shim/commit/2367e0953edd01ae9a5628e1f47cf14b0377a7d6)은 아래와 같습니다.
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved
```js
var getGlobal = function () {
// 전역객체에 접근할 수 있는 방법은`Function('return this')()`하나입니다.
// 그러나 이것은 Chrome 앱들에서는 CSP를 위반할 수 있습니다.
if (typeof self !== 'undefined') { return self; }
if (typeof window !== 'undefined') { return window; }
if (typeof global !== 'undefined') { return global; }
throw new Error('unable to locate global object');};
```

## HTML 과 `WindowProxy`

HTML에서 전역객체는 `Window`와 `WindowProxy`로 구별됩니다. 새로운 속성은 `Window`에 선언되지만, 상위 단계인 `this`는 `WindowProxy`와 동일합니다. `WindowProxy`는 모든 객체 연산을 `Window`로 전달하지만, 페이지가 변경되면 `globalThis`는 유지되는 반면, `Windows`는 갱신됩니다.
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved

이러한 구분은 아래의 `parent.html`, `frame-a.html`, `frame-b.html`,파일들로 구성된 시나리오에서 확인할 수 있습니다.
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved

아래의 코드는 `frame-a.html` 입니다.
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved
```html
<script>
globalThis.foo = 'a'; globalThis.getGlobalThis = () => globalThis;</script>
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved
```

아래의 코드는 `frame-b.html`입니다.
```html
<script>
globalThis.getGlobalThis = () => globalThis;</script>
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved
```

아래의 코드는 `parent.html`’입니다.
```html
<iframe src="frame-a.html"></iframe>
<script>
const iframe = document.querySelector('iframe');
iframe.onload = () => {
// 전역변수 `foo`는 존재함.
console.assert(frames[0].foo === 'a');
const before = frames[0].getGlobalThis();
iframe.onload = () => {
// 전역변수 foo`는 사라짐.
console.assert(frames[0].foo === undefined, 'The global object changes during navigation');
const after = frames[0].getGlobalThis();
// 하지만, `globalThis`는 여전히 동일함.
console.assert(before === after, 'globalThis maintains its identity during navigation');
};
iframe.src = 'frame-b.html';
};
</script>
```

[이 데모](https://bead-pancake.glitch.me/)는 실제 전역객체 내에 네비게이션 동안 변경된 전역변수 `foo`가 저장되어있는 것을 보여줍니다. 하지만 `globalThis`는 네비게이션 동안 변경되지 않았습니다. 그러므로 `globalThis`는 전역객체가 아닙니다.
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved

따라서, `globalThis`는 JavaScript에서 직접적으로 접근할 수 없는 "전역객체"와 명백하게 다릅니다. [웹 브라우저에서는 `foo !== globalThis.foo`가 가능할 수도 있습니다.(전역 범위에서)](https://concise-walker.glitch.me/)
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved

ES6/ES2015는 `Window`/`WindowProxy` 구조를 설명하지 않으며, 단순히 "전역객체"라고 말하고 있습니다. 이 명세는 동일합니다. 만약 ECMAScript에서 top-level `this`가 `WindowProxy`로 설명되도록 명세가 변경된다면, 이러한 변경점은 해당 제안서에도 동일하게 반영되어야합니다.
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved

## SES interaction

For Secure ECMAScript, it is important that all references to the global object be spoof-able and capable of being locked down, so that each context gets its own shadow global context. Additionally, references to the global object should not be reachable from other ECMAScript intrinsic objects, which SES would like to simply recursively freeze. In this proposal, `globalThis` is a writable and configurable property of the global object, so it should meet SES requirements.
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved

Secure ECMAScript에서는 전역객체에 대한 모든 참조가 스푸닝 가능하며, 잠길 수 있기 때문에 각 컨테스트가 숨겨진 전역 컨텍스트를 가질 수 있도록 하는 것이 중요합니다. 추가적으로, 전역객체에 대한 참조는 SES가 단순히 재귀적으로 동결하기를 원하는 다른 ECMAScript의 독립된 객체들에서 접근이 불가능해야합니다. 이 제안서에서 `globalThis`는 전역 객체의 쓰기 및 수정 가능한 속성입니다. 그러므로 이 것은 SES의 요구사항을 만족합니다.
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved


## 네이밍

~~`System.global` 대신 기존 글로벌 속성 이름, 특히 `global` 또는 `window` 중 하나를 다시 정의하고자 하였습니다. 이 두 가지 중 하나가 런타임 환경 탐지를 수행하는 기존 코드를 중단하는지에 대한 추가 연구가 수행될 것입니다. 추가 연구를 통해 `global`을 사용해도 기존 코드가 깨지지 않을 것으로 확인되었습니다.~~
chanuuuuu marked this conversation as resolved.
Show resolved Hide resolved
`global`이라는 이름을 사용하려고 하였으나, 몇몇 웹사이트를 손상시키는 것으로 나타났습니다.

데이터를 수집하여 몇몇 후보들의 웹 호환성을 확인한 후, 우리는 웹 호환성을 만족하면서 "전역 `this` 값"에 대한 개념에 대응되는 `globalThis`로 결정하였습니다. (그러면서도 [위의 개념](https://github.com/tc39/proposal-global#html-and-the-windowproxy)에 따라 “전역객체" 아닌).

대체안들의 상세한 목록을 보기 위해서는 [NAMING.md](NAMING.md)을 확인하세요.

## 명세서
명세서를 [markdown format](spec.md) 또는 [HTML](http://tc39.github.io/proposal-global/)형식으로 볼 수 있습니다.

## 감사
최초로 영감을 주신 분은 https://twitter.com/littledan/status/627284720284372992 / http://littledan.github.io/global.html 입니다.