Чому JavaScript піднімає змінні?


94

Чому JavaScript піднімає змінні?

Що було обґрунтуванням дизайнерів, коли вони вирішили здійснити підйом? Чи існують інші популярні мови, які цим займаються?

Будь ласка, надайте відповідні посилання на документацію та / або записи.


7
На даний момент я підозрюю, що це історично, і я серйозно сумніваюся, що це було щось інше, крім "простоти впровадження".
Dave Newton

4
Чесно, запитайте у Брендана Ейха, здається, він досить чуйний.
Фелікс Клінг,

22
Як це питання не є конструктивним?
Франциск

18
@Francisc ласкаво просимо до Stack Overflow, де все, про що можна запитати, - це переміщення divв jQuery
Xlaudius

20
Це справді важливе питання. Це слід було дозволити. Це не була полум'яна принада. Підняття є одним із основних елементів розуміння того, як працює JavaScript, і "чому" - це законне запитання, яке розглядається у більшості підручників щодо мови. НЕ ОК, що люди, які переповнюють стек, ПОСТІЙНО тупають над такими запитаннями людей.
bearvarine

Відповіді:


55

Як пояснює Стоян Стефанов у книзі "Шаблони JavaScript", піднімання є результатом реалізації інтерпретатора JavaScript.

Інтерпретація коду JS виконана за два проходи. Під час першого проходження інтерпретатор обробляє оголошення змінних та функцій.

Другий прохід - це фактичний крок виконання коду. Інтерпретатор обробляє вирази функцій та незадекларовані змінні.

Таким чином, ми можемо використовувати поняття "підняття" для опису такої поведінки.


15
Мені особисто дуже не подобається слово "підйом". Це дає хибне уявлення, що оголошення змінних та функцій магічно підносяться до верхньої частини поточної області дії, коли насправді інтерпретатор JS, як ви вже згадували, сканує вихідний код для прив'язок, а потім виконує код.
contactmatt

Тепер я зрозумів, чому JS найбільш неправильно розуміє мову, я не бачив цього ні в одному підручнику. І заплутався з підйомом (і перекладом перекладачів).
Swapnil Patwa

17
Е-е, це насправді не пояснює обгрунтування. Однопрохідний перекладач (що не призвело б до підйому) був би набагато простішим - так чому ж дизайнери вибрали два проходи?
Бергі

1
Це не пояснює, чому саме змінні піднімаються. Функції мають сенс, змінні ні (у більшості випадків) - я вважаю, що це помилка.
Джош М.

Джош М. Це так детально зазначено, я не думаю, що це "помилка" ... (я згоден, що ця відповідь насправді не відповідає на міркування)
Jonas Wilms,

10

Творець JS Брендан Айх якось сказав (у Twitter) :

"Таким чином, підняття змінних вар є [ненавмисним наслідком підняття функції, відсутність сфери блоку, [та] JS як оперативна робота 1995 року".

Він також пояснив, що ...

"функція піднімання дозволяє розкласти програму зверху вниз," дозвольте rec "безкоштовно, зателефонуйте перед оголошенням; var піднімання позначено."

Брендан Ейх

Чи існують інші популярні мови, які цим займаються?

Я не знаю жодної іншої популярної мови, яка піднімає змінні таким же чином. Я думаю, навіть ActionScript - ще одна реалізація ECMAScript, що використовується у розробці Flash - не реалізувала підняття. Це спричинило плутанину та розчарування для розробників, знайомих з іншими мовами, які вивчають JavaScript.

ОНОВЛЕННЯ: З коментарів, Python має подібну поведінку піднімання змінних .


2
Надання оцінки +1, оскільки це єдина відповідь, яка намагається безпосередньо вирішити питання.
Деймон

1
Дякую за цю відповідь. Я повністю згоден з @Damon!
codingbryan

1
Інший популярний мову , який має змінну Підйомно є Python: stackoverflow.com/q/63337235/2326961
Maggyero

2

Це тому, що інтерпретатор javascript інтерпретує код за два цикли.

  1. Заповнення / компіляція коду:
  2. Виконання коду:

У 1 - му циклі всі оголошення змінних і функції приймаються у верхній частині області видимості функції він виконується. Це допомагає в створенні variableObjectsдля execution contextфункції ще до того, це виконання.

На другому етапі присвоєння значень, оператори коду та виклики функцій виконуються по черзі за очікуваним чином.

Ви тут трохи детальніше прочитали .

Це дасть вам більш повну картину навколо поведінки навколо let, constі classдекларацій, також пріоритеті слід між змінними і функціями.


1
Ви натякаєте, що це наслідок вибору дизайну? Якщо так, то ви повинні чітко зазначити це у своїй відповіді. Але читаючи відповідь Брендана Ейха, це могло б бути розшукуваною особливістю, це залежить від того, як ви тлумачите останнє речення. Підсумок, я досі точно не знаю, чому
Бомбінош,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.