Я наконец-то нашел ответы, я знаю, что никто не напишет код полностью такой же, как я написал, используя блок напрямую, однако, если вы видите это, javascript - Uncaught SyntaxError: Identifier * уже объявлен , возможно, мы можем написать неправильный код, если у нас нет хорошего понимания области действия в JS. Я должен упомянуть, что код должен работать в ES6 вместо строгого режима ES5 , также упомянуть, что он работает на Chrome, который браузер поддерживает ES6 , так что извините, чтобы запутать викарпов.
На основе http://www.ecma-international.org/ecma-262/6.0/#sec -Additional-ecmascript-features-for-web-browser , B.3.3, Объявления функций на уровне блоков Семантика совместимости устаревшего веб-интерфейса, В ES6 объявление функции в блок использует семантику объявления ES6 (например, let или const), которая не позволяет переопределения.
Таким образом, ответ
{
function test() {}
test = 123
}
console.log(test)
console.log(typeof test)
будет
var test
{
let test = function test() {};
window.test1 = test1
test = 123;
}
console.log(test) //f test(){}
{
function test1() {}
test1 = 123
function test1() {}
}
console.log(test1)
console.log(typeof test1)
будет
var test1
{
let test1 = function test1() { }
window.test1 = test1
test1 = 123
window.test1 = test1
}
console.log(test1) //123
{
function test2() {}
test2 = 123
function test2() {}
test2 = 345
}
console.log(test2)
будет
var test2
{
let test2 = function test2() {}
window.test2 = test2
test2 = 123
window.test2 = test2
test2 = 345
}
console.log(test2)