LINUX.ORG.RU

Еще один выкрутас function declaration

 


0

1

Я уже писал о некоторых аномалиях


if(false) function if_foo(){console.log("hello, I'm if_foo")}
if_foo() // hello, I'm if_foo

a="glob"
with({a: 1}){
function f(){console.log(a)}
}

f()// glob
И вот исчо один супрайз:
foo=function(){console.log("first foo")}
function foo(){console.log("second foo")}

foo()// first foo

Это, тащемта, элементарно, но я не замечал этого ранее, потому что всегда пользовался только FE.

В целом, мне JS все ж таки нравится, но вот это говно меня реально бесит. Почему я должен постоянно думать, как компилятор будет хавать мой код? Что он инициализирует в первом проходе, что во втором? А главное, еще раз: ЗАЧЕМ ЭТО НУЖНО!!! Какой профит???



Последнее исправление: linux-101 (всего исправлений: 1)

Потому что язык состряпали на коленке за 11 дней для отрисовки динамических менюшек и валидации форм, а не для чего-то более серьёзного.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Но почему до сих пор не выпилили? Уже сколько времени утекло с тех пор. И я что-то не слышал, чтобы в новом стандарте этот вопрос поднимался. Думаешь легаси? Они с этим не церемоняться особо, к примеру, __proto__ собираются выпилить, with, тысячи их, конструкций удобных, логичных и полезных, но плохо оптимизирующихся. А это говно не трогают.

linux-101
() автор топика
Ответ на: комментарий от linux-101

with довольно кривой и опасный, чтобы его оставлять. Для function hoisting вот можно найти применение, например, в AngularJS можно объявить компонент выше определения. При этом именованность функции будет полезна в стэктрейсе ошибки. Хотя кто их там знает, конечно.

static_lab ★★★★★
()

Геи!

Вокруг одни геи!

anonymous
()
Ответ на: комментарий от static_lab

Вместо __proto__ предлагают использовать getPrototypeOf() и setPrototypeOf(), так что особых сложностей быть не должно.

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

При этом именованность функции будет полезна в стэктрейсе ошибки. Хотя кто их там знает, конечно.

А именованность тут параллельна. foo=function foo(){} — это именованная функция.

linux-101
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.