Для меня лидером по убийству нервных клеток была передача аргументов в функцию в момент её вызова.
Учили меня программированию серьёзно в университете, на языках Object Pascal и C++. Там, в отличие от хипстерских Python и Javascript, есть критическая, я бы даже сказал, фатальная разница между тем, что именно ты передаёшь в функцию при её вызове - безымянные данные, имя локальной переменной, имя локальной переменной, в которой указатель, указатель, который мы сами получили через свои аргументы вызова или что-то ещё другое, там много разных вариантов может быть. "Передача по ссылке", "передача по значению", вот это вот всё.
Это сейчас мне разница между rvalue и lvalue кажется естественной и само собой разумеющейся, а в самом начале это было такой болью, что писать на C++ вообще не хотелось больше никогда в жизни.
Когда же после этого переходишь в язык, который позволяет создавать
замыкания, то есть, функции, тело которых ссылается на имена, доступные в том месте, где мы создаём само замыкание, всё становится примерно в сто миллиардов раз сложнее. Вообще в целом переход из языка без лямбд в язык с лямбдами это тоже для неподготовленного ума серьёзное испытание. Если вы до конца не понимаете сложность того, о чём я говорю,
почитайте, как резолвится имя `this` в Javascript.