Пожалуйста, посмотрите на следующий код:
"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