Почему перезапись функций не разрешена в модулях ES6? - PullRequest
3 голосов
/ 08 октября 2019

Пожалуйста, посмотрите на следующий код:

"use strict"

function test1()
{
    // first
}

function test1()
{
    // second
}

let a=1
console.log( test1 );
<html>
<head>
    <script type="text/javascript" src="./test.js"></script>
</head>
<body>
<p>Hello World!</p>
</body>
</html>

Как видите, этот код работает, хотя второе определение «test1» перезапишет первое. Теперь взгляните на следующий код; (HTML-файл отличается)

"use strict"

function test1()
{
    // first
}

function test1()
{
    // second
}

let a=1
console.log( test1 );
<html>
<head>
    <script type="module" src="./test.js"></script>
</head>
<body>
<p>Hello World!</p>
</body>
</html>

Этот код не работает и выдает эту ошибку

"Uncaught SyntaxError: Identifier 'test1' has already been declared"

(Вы должны запустить его с локальным сервером длясм. ошибку. Я не могу произвести ее здесь)

Разница заключается в объеме. Во втором примере мы перезаписываем функцию в области видимости модуля, которая, по-видимому, недопустима, хотя и разрешена в глобальной области видимости !!! Я прав? Кто-нибудь может объяснить мне такое поведение?

(то же самое в node.js):

> node --experimental-modules --input-type=commonjs --eval 'function a(){}; function a(){}; console.log("ok");'

ok

> node --experimental-modules --input-type=module --eval 'function a(){}; function a(){}; console.log("ok");'
file://[eval1]:1
function a(){}; function a(){}; console.log("ok");
                ^
SyntaxError: Identifier 'a' has already been declared
...