Функциональное и переменное декларирование внутри блока - PullRequest
0 голосов
/ 17 апреля 2020

Может кто-нибудь объяснить вывод этого кода? Я вижу один тест кода сегодня и не понимаю вывод. Я знаю, что это тестирует область блока ES6. Я в порядке с первым, но не с остальными.

{
  function test() {}
  test = 123
}
console.log(test)
console.log(typeof test)

{
  function test1() {}
  test1 = 123

  function test1() {}
}
console.log(test1)
console.log(typeof test1)

{
  function test2() {}
  test2 = 123

  function test2() {}
  test2 = 345
}
console.log(test2)
console.log(typeof test2)

Может кто-нибудь объяснить мне, почему вывод:

ƒ test() {}
function
123
number
123
number

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Я наконец-то нашел ответы, я знаю, что никто не напишет код полностью такой же, как я написал, используя блок напрямую, однако, если вы видите это, 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)
1 голос
/ 17 апреля 2020

«используйте строгое» должно помочь вам избежать такого странного поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...